diff --git a/BUILD.gn b/BUILD.gn
index d16075d6..94469d3 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -692,10 +692,11 @@
   }
 
   if (enable_vr) {
-    deps += [
-      "//chrome/browser/vr:vr_common_unittests",
-      "//tools/perf/contrib/vr_benchmarks:vr_perf_tests",
-    ]
+    deps += [ "//chrome/browser/vr:vr_common_unittests" ]
+
+    if (is_android) {
+      deps += [ "//tools/perf/contrib/vr_benchmarks:vr_perf_tests" ]
+    }
   }
 }
 
diff --git a/DEPS b/DEPS
index 166c4ca..237fcda 100644
--- a/DEPS
+++ b/DEPS
@@ -52,7 +52,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': '3ec75686fd9340bf1e0073e37466e1e082aa7e85',
+  'angle_revision': 'c5af8ba6ebd2246b4c214f30bd50ba80fa8b1e3e',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling build tools
   # and whatever else without interference from each other.
diff --git a/WATCHLISTS b/WATCHLISTS
index ff7ea623..d40740c 100644
--- a/WATCHLISTS
+++ b/WATCHLISTS
@@ -508,6 +508,9 @@
     'ftp': {
       'filepath': 'ftp',
     },
+    'fuchsia': {
+      'filepath': 'fuchsia',
+    },
     'fuzzing': {
       'filepath': 'fuzz|Fuzz',
     },
@@ -2040,6 +2043,7 @@
                  'yamaguchi+watch@chromium.org'],
     'filesapp_ui': ['mtomasz+watch@chromium.org'],
     'ftp': ['phajdan.jr@chromium.org'],
+    'fuchsia': ['sergeyu@chromium.org', 'wez@chromium.org'],
     'fuzzing': ['fuzzing@chromium.org'],
     'gcm': ['johnme+watch@chromium.org',
             'peter@chromium.org',
diff --git a/android_webview/browser/hardware_renderer.cc b/android_webview/browser/hardware_renderer.cc
index f234eabf..46029ea4 100644
--- a/android_webview/browser/hardware_renderer.cc
+++ b/android_webview/browser/hardware_renderer.cc
@@ -15,9 +15,9 @@
 #include "base/memory/ptr_util.h"
 #include "base/trace_event/trace_event.h"
 #include "cc/output/compositor_frame.h"
-#include "cc/surfaces/frame_sink_manager.h"
 #include "components/viz/common/surfaces/local_surface_id_allocator.h"
 #include "components/viz/service/frame_sinks/compositor_frame_sink_support.h"
+#include "components/viz/service/frame_sinks/frame_sink_manager.h"
 #include "ui/gfx/transform.h"
 #include "ui/gl/gl_bindings.h"
 
diff --git a/android_webview/browser/surfaces_instance.cc b/android_webview/browser/surfaces_instance.cc
index 80439e8..2dc0589 100644
--- a/android_webview/browser/surfaces_instance.cc
+++ b/android_webview/browser/surfaces_instance.cc
@@ -17,11 +17,11 @@
 #include "cc/quads/solid_color_draw_quad.h"
 #include "cc/quads/surface_draw_quad.h"
 #include "cc/scheduler/begin_frame_source.h"
-#include "cc/surfaces/frame_sink_manager.h"
 #include "components/viz/common/surfaces/local_surface_id_allocator.h"
 #include "components/viz/service/display/display.h"
 #include "components/viz/service/display/display_scheduler.h"
 #include "components/viz/service/frame_sinks/compositor_frame_sink_support.h"
+#include "components/viz/service/frame_sinks/frame_sink_manager.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/geometry/size.h"
 #include "ui/gfx/transform.h"
@@ -54,7 +54,7 @@
   // Webview does not own the surface so should not clear it.
   settings.should_clear_root_render_pass = false;
 
-  frame_sink_manager_.reset(new cc::FrameSinkManager);
+  frame_sink_manager_.reset(new viz::FrameSinkManager);
   local_surface_id_allocator_.reset(new viz::LocalSurfaceIdAllocator());
 
   constexpr bool is_root = true;
@@ -106,7 +106,7 @@
   return frame_sink_id_allocator_.NextFrameSinkId();
 }
 
-cc::FrameSinkManager* SurfacesInstance::GetFrameSinkManager() {
+viz::FrameSinkManager* SurfacesInstance::GetFrameSinkManager() {
   return frame_sink_manager_.get();
 }
 
diff --git a/android_webview/browser/surfaces_instance.h b/android_webview/browser/surfaces_instance.h
index 4560b87..f42cc3ad 100644
--- a/android_webview/browser/surfaces_instance.h
+++ b/android_webview/browser/surfaces_instance.h
@@ -17,7 +17,6 @@
 
 namespace cc {
 class BeginFrameSource;
-class FrameSinkManager;
 }
 
 namespace gfx {
@@ -29,6 +28,7 @@
 namespace viz {
 class CompositorFrameSinkSupport;
 class Display;
+class FrameSinkManager;
 class LocalSurfaceIdAllocator;
 }  // namespace viz
 
@@ -43,7 +43,7 @@
   static scoped_refptr<SurfacesInstance> GetOrCreateInstance();
 
   viz::FrameSinkId AllocateFrameSinkId();
-  cc::FrameSinkManager* GetFrameSinkManager();
+  viz::FrameSinkManager* GetFrameSinkManager();
 
   void DrawAndSwap(const gfx::Size& viewport,
                    const gfx::Rect& clip,
@@ -82,7 +82,7 @@
 
   viz::FrameSinkId frame_sink_id_;
 
-  std::unique_ptr<cc::FrameSinkManager> frame_sink_manager_;
+  std::unique_ptr<viz::FrameSinkManager> frame_sink_manager_;
   std::unique_ptr<cc::BeginFrameSource> begin_frame_source_;
   std::unique_ptr<viz::Display> display_;
   std::unique_ptr<viz::LocalSurfaceIdAllocator> local_surface_id_allocator_;
diff --git a/ash/app_list/app_list_presenter_delegate.cc b/ash/app_list/app_list_presenter_delegate.cc
index 23e902f..98708f1f1 100644
--- a/ash/app_list/app_list_presenter_delegate.cc
+++ b/ash/app_list/app_list_presenter_delegate.cc
@@ -15,6 +15,7 @@
 #include "ash/shelf/shelf_widget.h"
 #include "ash/shell.h"
 #include "ash/wm/maximize_mode/maximize_mode_controller.h"
+#include "ash/wm/window_state.h"
 #include "base/command_line.h"
 #include "ui/app_list/app_list_constants.h"
 #include "ui/app_list/app_list_features.h"
@@ -120,6 +121,8 @@
     view->MaybeSetAnchorPoint(GetCenterOfDisplayForWindow(
         root_window, GetMinimumBoundsHeightForAppList(view)));
   }
+  wm::GetWindowState(view->GetWidget()->GetNativeWindow())
+      ->set_ignored_by_shelf(true);
   keyboard::KeyboardController* keyboard_controller =
       keyboard::KeyboardController::GetInstance();
   if (keyboard_controller)
diff --git a/ash/app_list/app_list_presenter_delegate_unittest.cc b/ash/app_list/app_list_presenter_delegate_unittest.cc
index 10c6b451..c7be812 100644
--- a/ash/app_list/app_list_presenter_delegate_unittest.cc
+++ b/ash/app_list/app_list_presenter_delegate_unittest.cc
@@ -699,6 +699,8 @@
   app_list_presenter_impl()->Show(GetPrimaryDisplayId());
   EXPECT_TRUE(app_list::features::IsFullscreenAppListEnabled());
   EXPECT_FALSE(GetPrimaryShelf()->IsHorizontalAlignment());
+  // TODO(muyuanli): This should be SHELF_BACKGROUND_OVERLAP but the test
+  // construction code is not quite correct. See crbug.com/742461.
   EXPECT_EQ(GetPrimaryShelf()->shelf_layout_manager()->GetShelfBackgroundType(),
             SHELF_BACKGROUND_DEFAULT);
 }
diff --git a/ash/mus/standalone/ash_standalone_main.cc b/ash/mus/standalone/ash_standalone_main.cc
index 386338e..27509a6 100644
--- a/ash/mus/standalone/ash_standalone_main.cc
+++ b/ash/mus/standalone/ash_standalone_main.cc
@@ -22,7 +22,6 @@
 #include "ui/app_list/presenter/app_list.h"
 #include "ui/aura/window.h"
 #include "ui/aura/window_tree_host.h"
-#include "ui/display/screen.h"
 #include "ui/views/examples/examples_window.h"
 
 namespace ash {
@@ -54,10 +53,6 @@
     Shell::Get()->AddShellObserver(this);
   }
 
-  void PreShutdown() override {
-    display::Screen::GetScreen()->RemoveObserver(window_watcher_.get());
-  }
-
   // ShellObserver:
   void OnShellInitialized() override {
     Shell::Get()->RemoveShellObserver(this);
@@ -70,7 +65,6 @@
     example_session_controller_client_->Initialize();
 
     window_watcher_ = base::MakeUnique<shell::WindowWatcher>();
-    display::Screen::GetScreen()->AddObserver(window_watcher_.get());
     shell::InitWindowTypeLauncher(base::Bind(&ShowViewsExamples));
 
     // Initialize the example app list presenter.
diff --git a/ash/shelf/shelf_layout_manager_unittest.cc b/ash/shelf/shelf_layout_manager_unittest.cc
index e6aa47ef..a65b0b6d2 100644
--- a/ash/shelf/shelf_layout_manager_unittest.cc
+++ b/ash/shelf/shelf_layout_manager_unittest.cc
@@ -9,6 +9,7 @@
 #include "ash/focus_cycler.h"
 #include "ash/public/cpp/config.h"
 #include "ash/public/cpp/shell_window_ids.h"
+#include "ash/root_window_controller.h"
 #include "ash/session/session_controller.h"
 #include "ash/shelf/shelf.h"
 #include "ash/shelf/shelf_constants.h"
@@ -1559,6 +1560,24 @@
       ->set_autohide_shelf_when_maximized_or_fullscreen(false);
   widget_two->Activate();
   EXPECT_EQ(SHELF_VISIBLE, shelf->GetVisibilityState());
+
+  wm::GetWindowState(window_two)
+      ->set_autohide_shelf_when_maximized_or_fullscreen(true);
+  window_two->SetProperty(aura::client::kAlwaysOnTopKey, true);
+
+  auto* shelf_window = shelf->GetWindow();
+  aura::Window* container = shelf_window->GetRootWindow()->GetChildById(
+      kShellWindowId_AlwaysOnTopContainer);
+  auto iter = std::find(container->children().begin(),
+                        container->children().end(), window_two);
+  EXPECT_NE(iter, container->children().end());
+
+  widget_two->Maximize();
+  EXPECT_EQ(SHELF_AUTO_HIDE, shelf->GetVisibilityState());
+
+  wm::WorkspaceWindowState window_state =
+      RootWindowController::ForWindow(shelf_window)->GetWorkspaceWindowState();
+  EXPECT_EQ(wm::WORKSPACE_WINDOW_STATE_MAXIMIZED, window_state);
 }
 
 TEST_F(ShelfLayoutManagerTest, ShelfFlickerOnTrayActivation) {
diff --git a/ash/shell.h b/ash/shell.h
index b02f315..bc6949b3 100644
--- a/ash/shell.h
+++ b/ash/shell.h
@@ -172,10 +172,6 @@
 enum class Config;
 enum class LoginStatus;
 
-namespace shell {
-class WindowWatcher;
-}
-
 namespace test {
 class ShellTestApi;
 class SmsObserverTest;
@@ -629,7 +625,6 @@
   friend class ScopedRootWindowForNewWindows;
   friend class SmsObserverTest;
   friend class test::ShellTestApi;
-  friend class shell::WindowWatcher;
 
   Shell(std::unique_ptr<ShellDelegate> shell_delegate,
         std::unique_ptr<ShellPort> shell_port);
diff --git a/ash/shell/content/client/shell_browser_main_parts.cc b/ash/shell/content/client/shell_browser_main_parts.cc
index f8f291b..7f2f919d 100644
--- a/ash/shell/content/client/shell_browser_main_parts.cc
+++ b/ash/shell/content/client/shell_browser_main_parts.cc
@@ -18,6 +18,7 @@
 #include "base/bind.h"
 #include "base/command_line.h"
 #include "base/i18n/icu_util.h"
+#include "base/memory/ptr_util.h"
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/strings/string_number_conversions.h"
@@ -38,7 +39,6 @@
 #include "ui/base/material_design/material_design_controller.h"
 #include "ui/base/ui_base_paths.h"
 #include "ui/compositor/compositor.h"
-#include "ui/display/screen.h"
 #include "ui/message_center/message_center.h"
 #include "ui/views/examples/examples_window_with_content.h"
 #include "ui/wm/core/wm_state.h"
@@ -107,8 +107,7 @@
           Shell::Get()->session_controller());
   example_session_controller_client_->Initialize();
 
-  window_watcher_.reset(new ash::shell::WindowWatcher);
-  display::Screen::GetScreen()->AddObserver(window_watcher_.get());
+  window_watcher_ = base::MakeUnique<WindowWatcher>();
 
   ash::shell::InitWindowTypeLauncher(base::Bind(
       &views::examples::ShowExamplesWindowWithContent,
@@ -124,8 +123,6 @@
 }
 
 void ShellBrowserMainParts::PostMainMessageLoopRun() {
-  display::Screen::GetScreen()->RemoveObserver(window_watcher_.get());
-
   window_watcher_.reset();
   delegate_ = nullptr;
   ash::Shell::DeleteInstance();
diff --git a/ash/shell/content/client/shell_browser_main_parts.h b/ash/shell/content/client/shell_browser_main_parts.h
index 38fd8d1..e71e2eb 100644
--- a/ash/shell/content/client/shell_browser_main_parts.h
+++ b/ash/shell/content/client/shell_browser_main_parts.h
@@ -56,7 +56,7 @@
   std::unique_ptr<net::NetLog> net_log_;
   std::unique_ptr<content::ShellBrowserContext> browser_context_;
   std::unique_ptr<views::ViewsDelegate> views_delegate_;
-  std::unique_ptr<ash::shell::WindowWatcher> window_watcher_;
+  std::unique_ptr<WindowWatcher> window_watcher_;
   ShellDelegateImpl* delegate_;  // owned by Shell
   std::unique_ptr<wm::WMState> wm_state_;
   std::unique_ptr<ExampleAppListPresenter> example_app_list_presenter_;
diff --git a/ash/shell/window_watcher.cc b/ash/shell/window_watcher.cc
index 787b14af5..70f38a6 100644
--- a/ash/shell/window_watcher.cc
+++ b/ash/shell/window_watcher.cc
@@ -14,10 +14,9 @@
 #include "ash/shell.h"
 #include "ash/shell/window_watcher_shelf_item_delegate.h"
 #include "ash/wm/window_util.h"
+#include "base/memory/ptr_util.h"
 #include "base/strings/string_number_conversions.h"
 #include "ui/aura/window.h"
-#include "ui/aura/window_event_dispatcher.h"
-#include "ui/display/display.h"
 
 namespace ash {
 namespace shell {
@@ -68,7 +67,8 @@
 };
 
 WindowWatcher::WindowWatcher() {
-  workspace_window_watcher_.reset(new WorkspaceWindowWatcher(this));
+  Shell::Get()->AddShellObserver(this);
+  workspace_window_watcher_ = base::MakeUnique<WorkspaceWindowWatcher>(this);
   aura::Window::Windows root_windows = Shell::GetAllRootWindows();
   for (aura::Window::Windows::iterator iter = root_windows.begin();
        iter != root_windows.end(); ++iter) {
@@ -82,6 +82,7 @@
        iter != root_windows.end(); ++iter) {
     workspace_window_watcher_->RootWindowRemoved(*iter);
   }
+  Shell::Get()->RemoveShellObserver(this);
 }
 
 aura::Window* WindowWatcher::GetWindowByID(const ShelfID& id) {
@@ -133,17 +134,8 @@
   }
 }
 
-void WindowWatcher::OnDisplayAdded(const display::Display& new_display) {
-  aura::Window* root = Shell::GetRootWindowForDisplayId(new_display.id());
-  workspace_window_watcher_->RootWindowAdded(root);
-}
-
-void WindowWatcher::OnDisplayRemoved(const display::Display& old_display) {
-  // All windows in the display has already been removed, so no need to
-  // remove observers.
-}
-
-void WindowWatcher::OnDisplayMetricsChanged(const display::Display&, uint32_t) {
+void WindowWatcher::OnRootWindowAdded(aura::Window* root_window) {
+  workspace_window_watcher_->RootWindowAdded(root_window);
 }
 
 }  // namespace shell
diff --git a/ash/shell/window_watcher.h b/ash/shell/window_watcher.h
index 895035f..541d6d7 100644
--- a/ash/shell/window_watcher.h
+++ b/ash/shell/window_watcher.h
@@ -11,11 +11,10 @@
 #include <memory>
 
 #include "ash/public/cpp/shelf_types.h"
-#include "base/compiler_specific.h"
+#include "ash/shell_observer.h"
 #include "base/logging.h"
 #include "base/macros.h"
 #include "ui/aura/window_observer.h"
-#include "ui/display/display_observer.h"
 
 namespace aura {
 class Window;
@@ -24,12 +23,9 @@
 namespace ash {
 namespace shell {
 
-// TODO(sky): fix this class, its a bit broke with workspace2.
-
 // WindowWatcher is responsible for listening for newly created windows and
 // creating items on the Shelf for them.
-class WindowWatcher : public aura::WindowObserver,
-                      public display::DisplayObserver {
+class WindowWatcher : public aura::WindowObserver, public ShellObserver {
  public:
   WindowWatcher();
   ~WindowWatcher() override;
@@ -40,11 +36,8 @@
   void OnWindowAdded(aura::Window* new_window) override;
   void OnWillRemoveWindow(aura::Window* window) override;
 
-  // display::DisplayObserver overrides:
-  void OnDisplayAdded(const display::Display& new_display) override;
-  void OnDisplayRemoved(const display::Display& old_display) override;
-  void OnDisplayMetricsChanged(const display::Display& display,
-                               uint32_t metrics) override;
+  // ShellObserver:
+  void OnRootWindowAdded(aura::Window* root_window) override;
 
  private:
   class WorkspaceWindowWatcher;
diff --git a/ash/wm/toplevel_window_event_handler_unittest.cc b/ash/wm/toplevel_window_event_handler_unittest.cc
index c040e73..2b7be1f 100644
--- a/ash/wm/toplevel_window_event_handler_unittest.cc
+++ b/ash/wm/toplevel_window_event_handler_unittest.cc
@@ -89,7 +89,7 @@
  private:
   DISALLOW_COPY_AND_ASSIGN(ToplevelWindowEventHandlerTest);
 };
-}
+}  // namespace
 
 TEST_F(ToplevelWindowEventHandlerTest, Caption) {
   std::unique_ptr<aura::Window> w1(CreateWindow(HTCAPTION));
@@ -703,6 +703,38 @@
             window_state->GetRestoreBoundsInScreen().ToString());
 }
 
+// Tests that EasyResizeWindowTargeter expands the hit-test area when a
+// window is a transient child of a top-level window and is resizable.
+TEST_F(ToplevelWindowEventHandlerTest, EasyResizerUsed) {
+  std::unique_ptr<aura::Window> w1(CreateTestWindowInShellWithDelegate(
+      new TestWindowDelegate(HTCAPTION), -1, gfx::Rect(0, 0, 100, 100)));
+  std::unique_ptr<aura::Window> w11(CreateTestWindowInShellWithDelegate(
+      new TestWindowDelegate(HTCAPTION), -11, gfx::Rect(20, 20, 50, 50)));
+  ::wm::AddTransientChild(w1.get(), w11.get());
+  ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(),
+                                     gfx::Point(10, 10));
+
+  // Make |w11| non-resizable to avoid touch events inside its transient parent
+  // |w1| from going to |w11| because of EasyResizeWindowTargeter.
+  w11->SetProperty(aura::client::kResizeBehaviorKey,
+                   ui::mojom::kResizeBehaviorCanMaximize |
+                       ui::mojom::kResizeBehaviorCanMinimize);
+  // Clicking a point within w1 should activate that window.
+  generator.PressMoveAndReleaseTouchTo(gfx::Point(10, 10));
+  EXPECT_TRUE(wm::IsActiveWindow(w1.get()));
+
+  // Make |w11| resizable to allow touch events inside its transient parent
+  // |w1| that are close to |w11| border to go to |w11| thanks to
+  // EasyResizeWindowTargeter.
+  w11->SetProperty(aura::client::kResizeBehaviorKey,
+                   ui::mojom::kResizeBehaviorCanMaximize |
+                       ui::mojom::kResizeBehaviorCanMinimize |
+                       ui::mojom::kResizeBehaviorCanResize);
+  // Clicking a point within |w1| but close to |w11| should activate |w11|.
+  generator.PressMoveAndReleaseTouchTo(gfx::Point(10, 10));
+  EXPECT_TRUE(wm::IsActiveWindow(w11.get()));
+}
+
 // Tests that an unresizable window cannot be dragged or snapped using gestures.
 TEST_F(ToplevelWindowEventHandlerTest, GestureDragForUnresizableWindow) {
   std::unique_ptr<aura::Window> target(CreateWindow(HTCAPTION));
@@ -920,8 +952,8 @@
                                      ::wm::WINDOW_MOVE_SOURCE_TOUCH));
 }
 
-// Tests that dragging a snapped window to another display updates the window's
-// bounds correctly.
+// Tests that dragging a snapped window to another display updates the
+// window's bounds correctly.
 TEST_F(ToplevelWindowEventHandlerTest, DragSnappedWindowToExternalDisplay) {
   // TODO: SetLayoutForCurrentDisplays() needs to ported to mash.
   // http://crbug.com/698043.
@@ -962,8 +994,8 @@
       w1->GetBoundsInScreen()));
 }
 
-// Showing the resize shadows when the mouse is over the window edges is tested
-// in resize_shadow_and_cursor_test.cc
+// Showing the resize shadows when the mouse is over the window edges is
+// tested in resize_shadow_and_cursor_test.cc
 
 }  // namespace test
 }  // namespace ash
diff --git a/ash/wm/window_modality_controller_unittest.cc b/ash/wm/window_modality_controller_unittest.cc
index c76ce3e..0273a68 100644
--- a/ash/wm/window_modality_controller_unittest.cc
+++ b/ash/wm/window_modality_controller_unittest.cc
@@ -8,6 +8,7 @@
 #include "ash/test/ash_test_base.h"
 #include "ash/test/child_modal_window.h"
 #include "ash/wm/window_util.h"
+#include "services/ui/public/interfaces/window_manager.mojom.h"
 #include "ui/aura/client/aura_constants.h"
 #include "ui/aura/client/capture_client.h"
 #include "ui/aura/test/test_window_delegate.h"
@@ -412,6 +413,11 @@
   TouchTrackerWindowDelegate d11;
   std::unique_ptr<aura::Window> w11(CreateTestWindowInShellWithDelegate(
       &d11, -11, gfx::Rect(20, 20, 50, 50)));
+  // Make |w11| non-resizable to avoid touch events inside its transient parent
+  // |w1| from going to |w11| because of EasyResizeWindowTargeter.
+  w11->SetProperty(aura::client::kResizeBehaviorKey,
+                   ui::mojom::kResizeBehaviorCanMaximize |
+                       ui::mojom::kResizeBehaviorCanMinimize);
   ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(),
                                      gfx::Point(10, 10));
 
diff --git a/ash/wm/workspace_controller.cc b/ash/wm/workspace_controller.cc
index 8017164f..fd34e8f 100644
--- a/ash/wm/workspace_controller.cc
+++ b/ash/wm/workspace_controller.cc
@@ -9,8 +9,10 @@
 #include "ash/public/cpp/shell_window_ids.h"
 #include "ash/root_window_controller.h"
 #include "ash/shelf/shelf.h"
+#include "ash/shell.h"
 #include "ash/shell_port.h"
 #include "ash/wm/fullscreen_window_finder.h"
+#include "ash/wm/mru_window_tracker.h"
 #include "ash/wm/window_state.h"
 #include "ash/wm/wm_window_animations.h"
 #include "ash/wm/workspace/backdrop_controller.h"
@@ -61,11 +63,11 @@
 
   const gfx::Rect shelf_bounds(Shelf::ForWindow(viewport_)->GetIdealBounds());
   bool window_overlaps_launcher = false;
-  // The default container may contain windows that may overlap the launcher
-  // shelf and affect its transparency.
-  aura::Window* container =
-      viewport_->GetRootWindow()->GetChildById(kShellWindowId_DefaultContainer);
-  for (aura::Window* window : container->children()) {
+  auto mru_list = Shell::Get()->mru_window_tracker()->BuildMruWindowList();
+
+  for (aura::Window* window : mru_list) {
+    if (window->GetRootWindow() != viewport_->GetRootWindow())
+      continue;
     wm::WindowState* window_state = wm::GetWindowState(window);
     if (window_state->ignored_by_shelf() ||
         (window->layer() && !window->layer()->GetTargetVisibility())) {
diff --git a/base/BUILD.gn b/base/BUILD.gn
index a8fa43b..4357e62 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -341,10 +341,6 @@
     "files/memory_mapped_file_win.cc",
     "files/scoped_file.cc",
     "files/scoped_file.h",
-    "files/scoped_platform_handle.cc",
-    "files/scoped_platform_handle.h",
-    "files/scoped_platform_handle_posix.cc",
-    "files/scoped_platform_handle_win.cc",
     "files/scoped_temp_dir.cc",
     "files/scoped_temp_dir.h",
     "format_macros.h",
@@ -393,6 +389,7 @@
     "logging_win.h",
     "mac/authorization_util.h",
     "mac/authorization_util.mm",
+    "mac/availability.h",
     "mac/bind_objc_block.h",
     "mac/bundle_locations.h",
     "mac/bundle_locations.mm",
@@ -982,8 +979,6 @@
     "trace_event/memory_infra_background_whitelist.h",
     "trace_event/memory_peak_detector.cc",
     "trace_event/memory_peak_detector.h",
-    "trace_event/memory_tracing_observer.cc",
-    "trace_event/memory_tracing_observer.h",
     "trace_event/memory_usage_estimator.cc",
     "trace_event/memory_usage_estimator.h",
     "trace_event/process_memory_dump.cc",
@@ -2032,7 +2027,6 @@
     "files/file_util_unittest.cc",
     "files/important_file_writer_unittest.cc",
     "files/memory_mapped_file_unittest.cc",
-    "files/scoped_platform_handle_unittest.cc",
     "files/scoped_temp_dir_unittest.cc",
     "gmock_unittest.cc",
     "guid_unittest.cc",
diff --git a/base/files/file_util_unittest.cc b/base/files/file_util_unittest.cc
index db1f152..ed7adf91 100644
--- a/base/files/file_util_unittest.cc
+++ b/base/files/file_util_unittest.cc
@@ -39,7 +39,6 @@
 #include <tchar.h>
 #include <winioctl.h>
 #include "base/win/scoped_handle.h"
-#include "base/win/windows_version.h"
 #endif
 
 #if defined(OS_POSIX)
@@ -2028,18 +2027,16 @@
     ReparsePoint reparse_point(dir1, dir2);
     EXPECT_TRUE(reparse_point.IsValid());
 
-    if ((win::GetVersion() >= win::VERSION_VISTA)) {
-      // There can be a delay for the enumeration code to see the change on
-      // the file system so skip this test for XP.
-      // Enumerate the reparse point.
-      FileEnumerator f6(dir1, true, FILES_AND_DIRECTORIES);
-      FindResultCollector c6(&f6);
-      FilePath inner2 = dir1.Append(FPL("inner"));
-      EXPECT_TRUE(c6.HasFile(inner2));
-      EXPECT_TRUE(c6.HasFile(inner2.Append(FPL("innerfile.txt"))));
-      EXPECT_TRUE(c6.HasFile(dir1.Append(FPL("dir2file.txt"))));
-      EXPECT_EQ(3, c6.size());
-    }
+    // There can be a delay for the enumeration code to see the change on
+    // the file system so skip this test for XP.
+    // Enumerate the reparse point.
+    FileEnumerator f6(dir1, true, FILES_AND_DIRECTORIES);
+    FindResultCollector c6(&f6);
+    FilePath inner2 = dir1.Append(FPL("inner"));
+    EXPECT_TRUE(c6.HasFile(inner2));
+    EXPECT_TRUE(c6.HasFile(inner2.Append(FPL("innerfile.txt"))));
+    EXPECT_TRUE(c6.HasFile(dir1.Append(FPL("dir2file.txt"))));
+    EXPECT_EQ(3, c6.size());
 
     // No changes for non recursive operation.
     FileEnumerator f7(temp_dir_.GetPath(), false, FILES_AND_DIRECTORIES);
diff --git a/base/files/scoped_platform_handle.cc b/base/files/scoped_platform_handle.cc
deleted file mode 100644
index a0c30155..0000000
--- a/base/files/scoped_platform_handle.cc
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/files/scoped_platform_handle.h"
-
-namespace base {
-
-ScopedPlatformHandle::ScopedPlatformHandle() : ScopedPlatformHandle(nullptr) {}
-
-ScopedPlatformHandle::ScopedPlatformHandle(std::nullptr_t) {}
-
-ScopedPlatformHandle::ScopedPlatformHandle(ScopedPlatformHandle&& other) =
-    default;
-
-ScopedPlatformHandle::ScopedPlatformHandle(HandleType handle)
-    : handle_(handle) {}
-
-ScopedPlatformHandle::ScopedPlatformHandle(ScopedHandleType handle)
-    : handle_(std::move(handle)) {}
-
-ScopedPlatformHandle::~ScopedPlatformHandle() {}
-
-ScopedPlatformHandle& ScopedPlatformHandle::operator=(
-    ScopedPlatformHandle&& other) = default;
-
-ScopedPlatformHandle::ScopedHandleType ScopedPlatformHandle::Take() {
-  return ScopedHandleType(release());
-}
-
-}  // namespace base
diff --git a/base/files/scoped_platform_handle.h b/base/files/scoped_platform_handle.h
deleted file mode 100644
index cfff5a7..0000000
--- a/base/files/scoped_platform_handle.h
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_FILES_SCOPED_PLATFORM_HANDLE_H_
-#define BASE_FILES_SCOPED_PLATFORM_HANDLE_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "base/base_export.h"
-#include "build/build_config.h"
-
-#if defined(OS_WIN)
-#include <windows.h>
-
-#include "base/win/scoped_handle.h"
-#elif defined(OS_POSIX)
-#include "base/files/scoped_file.h"
-#endif
-
-namespace base {
-
-// A ScopedPlatformHandle encapsulates ownership of either a Windows handle or
-// a POSIX file descriptor, while presenting a common interface for the sake
-// of simple, consistent, and safe ownership semantics. Platform-specific usage
-// details are thus relegated to code which either acquires or uses the
-// underlying platform resource.
-class BASE_EXPORT ScopedPlatformHandle {
- public:
-#if defined(OS_WIN)
-  using HandleType = HANDLE;
-  using ScopedHandleType = win::ScopedHandle;
-#elif defined(OS_POSIX)
-  using HandleType = int;
-  using ScopedHandleType = ScopedFD;
-#endif
-
-  // Constructors for an invalid ScopedPlatformHandle.
-  ScopedPlatformHandle();
-  ScopedPlatformHandle(std::nullptr_t);
-
-  ScopedPlatformHandle(ScopedPlatformHandle&& other);
-
-  // These constructors always take ownership of the given handle.
-  explicit ScopedPlatformHandle(HandleType handle);
-  explicit ScopedPlatformHandle(ScopedHandleType handle);
-
-  ~ScopedPlatformHandle();
-
-  ScopedPlatformHandle& operator=(ScopedPlatformHandle&& other);
-
-  // Indicates whether this ScopedPlatformHandle is holding a valid handle.
-  bool is_valid() const;
-
-  // Closes the handle.
-  void reset();
-
-  // Returns the platform-specific handle value.
-  HandleType get() const;
-
-  // Returns the platform-specific handle value, releasing ownership of the
-  // handle.
-  HandleType release();
-
-  // Transfers ownership of the handle to a platform-specific scoper.
-  ScopedHandleType Take();
-
- private:
-  ScopedHandleType handle_;
-};
-
-}  // namespace base
-
-#endif  // BASE_FILES_SCOPED_PLATFORM_HANDLE_H_
diff --git a/base/files/scoped_platform_handle_posix.cc b/base/files/scoped_platform_handle_posix.cc
deleted file mode 100644
index 38ee85a6..0000000
--- a/base/files/scoped_platform_handle_posix.cc
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/files/scoped_platform_handle.h"
-
-namespace base {
-
-bool ScopedPlatformHandle::is_valid() const {
-  return handle_.is_valid();
-}
-
-void ScopedPlatformHandle::reset() {
-  handle_.reset();
-}
-
-ScopedPlatformHandle::HandleType ScopedPlatformHandle::get() const {
-  return handle_.get();
-}
-
-ScopedPlatformHandle::HandleType ScopedPlatformHandle::release() {
-  return handle_.release();
-}
-
-}  // namespace base
diff --git a/base/files/scoped_platform_handle_unittest.cc b/base/files/scoped_platform_handle_unittest.cc
deleted file mode 100644
index 1b295854..0000000
--- a/base/files/scoped_platform_handle_unittest.cc
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/files/scoped_platform_handle.h"
-
-#include "base/files/file.h"
-#include "base/files/scoped_temp_dir.h"
-#include "base/macros.h"
-#include "base/strings/stringprintf.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(OS_WIN)
-#include <windows.h>
-
-#include "base/win/scoped_handle.h"
-#elif defined(OS_POSIX)
-#include "base/files/scoped_file.h"
-#endif
-
-namespace base {
-namespace {
-
-class ScopedPlatformHandleTest : public testing::Test {
- public:
-  ScopedPlatformHandleTest() { CHECK(temp_dir_.CreateUniqueTempDir()); }
-
- protected:
-  ScopedPlatformHandle CreateValidHandle() {
-    return ScopedPlatformHandle(OpenTempFile().TakePlatformFile());
-  }
-
- private:
-  base::File OpenTempFile() {
-    base::File temp_file(temp_dir_.GetPath().AppendASCII(
-                             base::StringPrintf("file_%d", next_file_id_)),
-                         base::File::FLAG_CREATE | base::File::FLAG_WRITE);
-    ++next_file_id_;
-    return temp_file;
-  }
-
-  ScopedTempDir temp_dir_;
-  int next_file_id_ = 1;
-
-  DISALLOW_COPY_AND_ASSIGN(ScopedPlatformHandleTest);
-};
-
-TEST_F(ScopedPlatformHandleTest, Invalid) {
-  ScopedPlatformHandle default_value;
-  EXPECT_TRUE(!default_value.is_valid());
-
-  ScopedPlatformHandle null_value(nullptr);
-  EXPECT_TRUE(!null_value.is_valid());
-
-  default_value.reset();
-  null_value.reset();
-  EXPECT_TRUE(!default_value.is_valid());
-  EXPECT_TRUE(!null_value.is_valid());
-}
-
-TEST_F(ScopedPlatformHandleTest, BasicUsage) {
-  ScopedPlatformHandle handle_a = CreateValidHandle();
-  ScopedPlatformHandle handle_b = CreateValidHandle();
-  EXPECT_TRUE(handle_a.is_valid());
-  EXPECT_TRUE(handle_b.is_valid());
-
-  ScopedPlatformHandle::HandleType handle_a_value = handle_a.get();
-  ScopedPlatformHandle::HandleType handle_b_value = handle_b.get();
-  EXPECT_TRUE(handle_a.is_valid());
-  EXPECT_TRUE(handle_b.is_valid());
-
-  ScopedPlatformHandle::ScopedHandleType scoped_handle = handle_a.Take();
-  ScopedPlatformHandle::HandleType raw_handle = handle_b.release();
-  EXPECT_FALSE(handle_a.is_valid());
-  EXPECT_FALSE(handle_b.is_valid());
-
-  handle_a = ScopedPlatformHandle(std::move(scoped_handle));
-  handle_b = ScopedPlatformHandle(raw_handle);
-  EXPECT_TRUE(handle_a.is_valid());
-  EXPECT_TRUE(handle_b.is_valid());
-  EXPECT_EQ(handle_a_value, handle_a.get());
-  EXPECT_EQ(handle_b_value, handle_b.get());
-
-  handle_b = std::move(handle_a);
-  EXPECT_FALSE(handle_a.is_valid());
-  EXPECT_TRUE(handle_b.is_valid());
-  EXPECT_EQ(handle_a_value, handle_b.get());
-
-  handle_b.reset();
-  EXPECT_FALSE(handle_b.is_valid());
-}
-
-}  // namespace
-}  // namespace base
diff --git a/base/files/scoped_platform_handle_win.cc b/base/files/scoped_platform_handle_win.cc
deleted file mode 100644
index 94235f2..0000000
--- a/base/files/scoped_platform_handle_win.cc
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/files/scoped_platform_handle.h"
-
-namespace base {
-
-bool ScopedPlatformHandle::is_valid() const {
-  return handle_.IsValid();
-}
-
-void ScopedPlatformHandle::reset() {
-  handle_.Close();
-}
-
-ScopedPlatformHandle::HandleType ScopedPlatformHandle::get() const {
-  return handle_.Get();
-}
-
-ScopedPlatformHandle::HandleType ScopedPlatformHandle::release() {
-  return handle_.Take();
-}
-
-}  // namespace base
diff --git a/base/mac/availability.h b/base/mac/availability.h
new file mode 100644
index 0000000..6d0bcc7
--- /dev/null
+++ b/base/mac/availability.h
@@ -0,0 +1,35 @@
+// Copyright (c) 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Provides the definition of API_AVAILABLE while we're on an SDK that doesn't
+// contain it yet.
+// TODO(thakis): Remove this file once we're on the 10.12 SDK.
+
+#ifndef BASE_MAC_AVAILABILITY_H_
+#define BASE_MAC_AVAILABILITY_H_
+
+#include <AvailabilityMacros.h>
+
+#if !defined(MAC_OS_X_VERSION_10_12) || \
+    MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_12
+#define __API_AVAILABLE_PLATFORM_macos(x) macos, introduced = x
+#define __API_AVAILABLE_PLATFORM_macosx(x) macosx, introduced = x
+#define __API_AVAILABLE_PLATFORM_ios(x) ios, introduced = x
+#define __API_AVAILABLE_PLATFORM_watchos(x) watchos, introduced = x
+#define __API_AVAILABLE_PLATFORM_tvos(x) tvos, introduced = x
+#define __API_A(x) __attribute__((availability(__API_AVAILABLE_PLATFORM_##x)))
+#define __API_AVAILABLE1(x) __API_A(x)
+#define __API_AVAILABLE2(x, y) __API_A(x) __API_A(y)
+#define __API_AVAILABLE3(x, y, z) __API_A(x) __API_A(y) __API_A(z)
+#define __API_AVAILABLE4(x, y, z, t) __API_A(x) __API_A(y) __API_A(z) __API_A(t)
+#define __API_AVAILABLE_GET_MACRO(_1, _2, _3, _4, NAME, ...) NAME
+#define API_AVAILABLE(...)                                                   \
+  __API_AVAILABLE_GET_MACRO(__VA_ARGS__, __API_AVAILABLE4, __API_AVAILABLE3, \
+                            __API_AVAILABLE2, __API_AVAILABLE1)              \
+  (__VA_ARGS__)
+#else
+#import <os/availability.h>
+#endif  // MAC_OS_X_VERSION_10_12
+
+#endif  // BASE_MAC_AVAILABILITY_H_
diff --git a/base/mac/sdk_forward_declarations.h b/base/mac/sdk_forward_declarations.h
index 40d23fb..cc405f9 100644
--- a/base/mac/sdk_forward_declarations.h
+++ b/base/mac/sdk_forward_declarations.h
@@ -20,6 +20,7 @@
 #include <stdint.h>
 
 #include "base/base_export.h"
+#include "base/mac/availability.h"
 
 // ----------------------------------------------------------------------------
 // Define typedefs, enums, and protocols not available in the version of the
@@ -188,15 +189,15 @@
 
 @interface NSView (ElCapitanSDK)
 - (void)setPressureConfiguration:(NSPressureConfiguration*)aConfiguration
-    __attribute__((availability(macos, introduced = 10.11)));
-@property(readonly, strong) NSLayoutXAxisAnchor* leftAnchor
-    __attribute__((availability(macos, introduced = 10.11)));
-@property(readonly, strong) NSLayoutXAxisAnchor* rightAnchor
-    __attribute__((availability(macos, introduced = 10.11)));
-@property(readonly, strong) NSLayoutYAxisAnchor* bottomAnchor
-    __attribute__((availability(macos, introduced = 10.11)));
-@property(readonly, strong) NSLayoutDimension* widthAnchor
-    __attribute__((availability(macos, introduced = 10.11)));
+    API_AVAILABLE(macos(10.11));
+@property(readonly, strong)
+    NSLayoutXAxisAnchor* leftAnchor API_AVAILABLE(macos(10.11));
+@property(readonly, strong)
+    NSLayoutXAxisAnchor* rightAnchor API_AVAILABLE(macos(10.11));
+@property(readonly, strong)
+    NSLayoutYAxisAnchor* bottomAnchor API_AVAILABLE(macos(10.11));
+@property(readonly, strong)
+    NSLayoutDimension* widthAnchor API_AVAILABLE(macos(10.11));
 @end
 
 @interface NSWindow (ElCapitanSDK)
diff --git a/base/message_loop/message_pump_fuchsia.cc b/base/message_loop/message_pump_fuchsia.cc
index 43a2b733..ffb0dc0 100644
--- a/base/message_loop/message_pump_fuchsia.cc
+++ b/base/message_loop/message_pump_fuchsia.cc
@@ -115,6 +115,10 @@
 }
 
 uint32_t MessagePumpFuchsia::FileDescriptorWatcher::WaitEnd(uint32_t observed) {
+  // Clear |handle_| so that StopWatchingFileDescriptor() is correctly treated
+  // as a no-op. WaitBegin() will refresh |handle_| if the wait is persistent.
+  handle_ = MX_HANDLE_INVALID;
+
   uint32_t events;
   __mxio_wait_end(io_, observed, &events);
   // |observed| can include other spurious things, in particular, that the fd
diff --git a/base/message_loop/message_pump_fuchsia.h b/base/message_loop/message_pump_fuchsia.h
index 3ca0785..fec4ab5 100644
--- a/base/message_loop/message_pump_fuchsia.h
+++ b/base/message_loop/message_pump_fuchsia.h
@@ -54,13 +54,20 @@
     friend class MessagePumpFuchsia;
 
     const tracked_objects::Location created_from_location_;
+
+    // Set directly from the inputs to WatchFileDescriptor.
     Watcher* watcher_ = nullptr;
     mx_handle_t port_ = MX_HANDLE_INVALID;
-    mx_handle_t handle_ = MX_HANDLE_INVALID;
-    mxio_t* io_ = nullptr;
     int fd_ = -1;
     uint32_t desired_events_ = 0;
 
+    // Set by WatchFileDescriptor to hold a reference to the descriptor's mxio.
+    mxio_t* io_ = nullptr;
+
+    // Set to the mxio's waitable handle, while a wait is pending (i.e. between
+    // WaitBegin and WaitEnd calls), and MX_HANDLE_INVALID otherwise.
+    mx_handle_t handle_ = MX_HANDLE_INVALID;
+
     // This bool is used during calling |Watcher| callbacks. This object's
     // lifetime is owned by the user of this class. If the message loop is woken
     // up in the case where it needs to call both the readable and writable
diff --git a/base/numerics/safe_conversions.h b/base/numerics/safe_conversions.h
index 4486148..9f3095bf 100644
--- a/base/numerics/safe_conversions.h
+++ b/base/numerics/safe_conversions.h
@@ -13,7 +13,9 @@
 
 #include "base/numerics/safe_conversions_impl.h"
 
-#if !defined(__native_client__) && (defined(__ARMEL__) || defined(__arch64__))
+// TODO(jschuh): Investigate why these were failing to build for ios.
+#if !defined(__APPLE__) && !defined(__native_client__) && \
+    (defined(__ARMEL__) || defined(__arch64__))
 #include "base/numerics/safe_conversions_arm_impl.h"
 #define BASE_HAS_OPTIMIZED_SAFE_CONVERSIONS (1)
 #else
diff --git a/base/process/process_util_unittest.cc b/base/process/process_util_unittest.cc
index f99d843f..12f3baf2 100644
--- a/base/process/process_util_unittest.cc
+++ b/base/process/process_util_unittest.cc
@@ -55,7 +55,6 @@
 #endif
 #if defined(OS_WIN)
 #include <windows.h>
-#include "base/win/windows_version.h"
 #endif
 #if defined(OS_MACOSX)
 #include <mach/vm_param.h>
@@ -494,13 +493,6 @@
       kEventToTriggerHandleSwitch,
       base::Uint64ToString(reinterpret_cast<uint64_t>(event.handle())));
 
-  // This functionality actually requires Vista or later. Make sure that it
-  // fails properly on XP.
-  if (base::win::GetVersion() < base::win::VERSION_VISTA) {
-    EXPECT_FALSE(base::LaunchProcess(cmd_line, options).IsValid());
-    return;
-  }
-
   // Launch the process and wait for it to trigger the event.
   ASSERT_TRUE(base::LaunchProcess(cmd_line, options).IsValid());
   EXPECT_TRUE(event.TimedWait(TestTimeouts::action_max_timeout()));
diff --git a/base/process/process_win.cc b/base/process/process_win.cc
index 1b38a6c..555f575 100644
--- a/base/process/process_win.cc
+++ b/base/process/process_win.cc
@@ -8,7 +8,6 @@
 #include "base/logging.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/process/kill.h"
-#include "base/win/windows_version.h"
 
 namespace {
 
@@ -187,7 +186,7 @@
   // sets the priority class on the threads but also on the IO generated
   // by it. Unfortunately it can only be set for the calling process.
   DWORD priority;
-  if ((base::win::GetVersion() >= base::win::VERSION_VISTA) && (is_current())) {
+  if (is_current()) {
     priority = value ? PROCESS_MODE_BACKGROUND_BEGIN :
                        PROCESS_MODE_BACKGROUND_END;
   } else {
diff --git a/base/trace_event/memory_allocator_dump.h b/base/trace_event/memory_allocator_dump.h
index 6764070..6176eb70 100644
--- a/base/trace_event/memory_allocator_dump.h
+++ b/base/trace_event/memory_allocator_dump.h
@@ -73,6 +73,11 @@
   // Called at trace generation time to populate the TracedValue.
   void AsValueInto(TracedValue* value) const;
 
+  // Get the size for this dump.
+  // The size is the value set with AddScalar(kNameSize, kUnitsBytes, size);
+  // TODO(hjd): Transitional until we send the full PMD. See crbug.com/704203
+  uint64_t GetSizeInternal() const { return size_; };
+
   // Use enum Flags to set values.
   void set_flags(int flags) { flags_ |= flags; }
   void clear_flags(int flags) { flags_ &= ~flags; }
@@ -89,15 +94,6 @@
   TracedValue* attributes_for_testing() const { return attributes_.get(); }
 
  private:
-  // TODO(hjd): Transitional until we send the full PMD. See crbug.com/704203
-  friend class MemoryDumpManager;
-  FRIEND_TEST_ALL_PREFIXES(MemoryAllocatorDumpTest, GetSize);
-
-  // Get the size for this dump.
-  // The size is the value set with AddScalar(kNameSize, kUnitsBytes, size);
-  // TODO(hjd): Transitional until we send the full PMD. See crbug.com/704203
-  uint64_t GetSize() const { return size_; };
-
   const std::string absolute_name_;
   ProcessMemoryDump* const process_memory_dump_;  // Not owned (PMD owns this).
   std::unique_ptr<TracedValue> attributes_;
diff --git a/base/trace_event/memory_allocator_dump_unittest.cc b/base/trace_event/memory_allocator_dump_unittest.cc
index ea187986..734c1c8 100644
--- a/base/trace_event/memory_allocator_dump_unittest.cc
+++ b/base/trace_event/memory_allocator_dump_unittest.cc
@@ -180,7 +180,7 @@
   dump->AddScalar(MemoryAllocatorDump::kNameSize,
                   MemoryAllocatorDump::kUnitsBytes, 1);
   dump->AddScalar("foo", MemoryAllocatorDump::kUnitsBytes, 2);
-  EXPECT_EQ(1u, dump->GetSize());
+  EXPECT_EQ(1u, dump->GetSizeInternal());
 }
 
 // DEATH tests are not supported in Android/iOS/Fuchsia.
diff --git a/base/trace_event/memory_dump_manager.cc b/base/trace_event/memory_dump_manager.cc
index 8d1690f..8b5e301 100644
--- a/base/trace_event/memory_dump_manager.cc
+++ b/base/trace_event/memory_dump_manager.cc
@@ -11,19 +11,13 @@
 #include <utility>
 
 #include "base/allocator/features.h"
-#include "base/atomic_sequence_num.h"
 #include "base/base_switches.h"
 #include "base/command_line.h"
-#include "base/compiler_specific.h"
 #include "base/debug/alias.h"
-#include "base/debug/debugging_flags.h"
 #include "base/debug/stack_trace.h"
 #include "base/debug/thread_heap_usage_tracker.h"
 #include "base/memory/ptr_util.h"
-#include "base/optional.h"
 #include "base/sequenced_task_runner.h"
-#include "base/strings/pattern.h"
-#include "base/strings/string_piece.h"
 #include "base/threading/thread.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/trace_event/heap_profiler.h"
@@ -35,7 +29,6 @@
 #include "base/trace_event/memory_dump_scheduler.h"
 #include "base/trace_event/memory_infra_background_whitelist.h"
 #include "base/trace_event/memory_peak_detector.h"
-#include "base/trace_event/memory_tracing_observer.h"
 #include "base/trace_event/process_memory_dump.h"
 #include "base/trace_event/trace_event.h"
 #include "base/trace_event/trace_event_argument.h"
@@ -52,16 +45,6 @@
 
 MemoryDumpManager* g_instance_for_testing = nullptr;
 
-void FillOsDumpFromProcessMemoryDump(
-    const ProcessMemoryDump* pmd,
-    MemoryDumpCallbackResult::OSMemDump* osDump) {
-  if (pmd->has_process_totals()) {
-    const ProcessMemoryTotals* totals = pmd->process_totals();
-    osDump->resident_set_kb = totals->resident_set_bytes() / 1024;
-    osDump->platform_private_footprint = totals->GetPlatformPrivateFootprint();
-  }
-}
-
 // Temporary (until peak detector and scheduler are moved outside of here)
 // trampoline function to match the |request_dump_function| passed to Initialize
 // to the callback expected by MemoryPeakDetector and MemoryDumpScheduler.
@@ -242,10 +225,6 @@
     TraceLog::GetInstance()->SetEnabled(filtering_trace_config,
                                         TraceLog::FILTERING_MODE);
   }
-
-  // TODO(hjd): Move out of MDM. See: crbug.com/703184
-  tracing_observer_ =
-      MakeUnique<MemoryTracingObserver>(TraceLog::GetInstance(), this);
 }
 
 void MemoryDumpManager::RegisterDumpProvider(
@@ -427,7 +406,7 @@
     VLOG(1) << "CreateProcessDump() FAIL: MemoryDumpManager is not initialized";
     if (!callback.is_null()) {
       callback.Run(false /* success */, args.dump_guid,
-                   Optional<MemoryDumpCallbackResult>());
+                   ProcessMemoryDumpsMap());
     }
     return;
   }
@@ -458,7 +437,8 @@
     // absent we fail the dump immediately.
     if (args.dump_type != MemoryDumpType::SUMMARY_ONLY &&
         heap_profiling_enabled_ && !heap_profiler_serialization_state_) {
-      callback.Run(false /* success */, args.dump_guid, base::nullopt);
+      callback.Run(false /* success */, args.dump_guid,
+                   ProcessMemoryDumpsMap());
       return;
     }
 
@@ -519,10 +499,10 @@
 
   // If the dump provider did not specify a task runner affinity, dump on
   // |dump_thread_|.
-  SequencedTaskRunner* task_runner = mdpinfo->task_runner.get();
+  scoped_refptr<SequencedTaskRunner> task_runner = mdpinfo->task_runner;
   if (!task_runner) {
     DCHECK(mdpinfo->options.dumps_on_single_thread_task_runner);
-    task_runner = pmd_async_state->dump_thread_task_runner.get();
+    task_runner = pmd_async_state->dump_thread_task_runner;
     DCHECK(task_runner);
   }
 
@@ -635,18 +615,6 @@
   SetupNextMemoryDump(std::move(pmd_async_state));
 }
 
-// static
-uint32_t MemoryDumpManager::GetDumpsSumKb(const std::string& pattern,
-                                          const ProcessMemoryDump* pmd) {
-  uint64_t sum = 0;
-  for (const auto& kv : pmd->allocator_dumps()) {
-    auto name = StringPiece(kv.first);
-    if (MatchPattern(name, pattern))
-      sum += kv.second->GetSize();
-  }
-  return sum / 1024;
-}
-
 void MemoryDumpManager::FinalizeDumpAndAddToTrace(
     std::unique_ptr<ProcessMemoryDumpAsyncState> pmd_async_state) {
   HEAP_PROFILER_SCOPED_IGNORE;
@@ -663,65 +631,9 @@
 
   TRACE_EVENT0(kTraceCategory, "MemoryDumpManager::FinalizeDumpAndAddToTrace");
 
-  // The results struct to fill.
-  // TODO(hjd): Transitional until we send the full PMD. See crbug.com/704203
-  Optional<MemoryDumpCallbackResult> result;
-
-  bool dump_successful = pmd_async_state->dump_successful;
-
-  for (const auto& kv : pmd_async_state->process_dumps) {
-    ProcessId pid = kv.first;  // kNullProcessId for the current process.
-    ProcessMemoryDump* process_memory_dump = kv.second.get();
-
-    // SUMMARY_ONLY dumps are just return the summarized result in the
-    // ProcessMemoryDumpCallback. These shouldn't be added to the trace to
-    // avoid confusing trace consumers.
-    if (pmd_async_state->req_args.dump_type != MemoryDumpType::SUMMARY_ONLY) {
-      bool added_to_trace = tracing_observer_->AddDumpToTraceIfEnabled(
-          &pmd_async_state->req_args, pid, process_memory_dump);
-
-      dump_successful = dump_successful && added_to_trace;
-    }
-
-    // TODO(hjd): Transitional until we send the full PMD. See crbug.com/704203
-    // Don't try to fill the struct in detailed mode since it is hard to avoid
-    // double counting.
-    if (pmd_async_state->req_args.level_of_detail ==
-        MemoryDumpLevelOfDetail::DETAILED)
-      continue;
-    if (!result.has_value())
-      result = MemoryDumpCallbackResult();
-    // TODO(hjd): Transitional until we send the full PMD. See crbug.com/704203
-    if (pid == kNullProcessId) {
-      result->chrome_dump.malloc_total_kb =
-          GetDumpsSumKb("malloc", process_memory_dump);
-      result->chrome_dump.v8_total_kb =
-          GetDumpsSumKb("v8/*", process_memory_dump);
-
-      result->chrome_dump.command_buffer_total_kb =
-          GetDumpsSumKb("gpu/gl/textures/*", process_memory_dump);
-      result->chrome_dump.command_buffer_total_kb +=
-          GetDumpsSumKb("gpu/gl/buffers/*", process_memory_dump);
-      result->chrome_dump.command_buffer_total_kb +=
-          GetDumpsSumKb("gpu/gl/renderbuffers/*", process_memory_dump);
-
-      // partition_alloc reports sizes for both allocated_objects and
-      // partitions. The memory allocated_objects uses is a subset of
-      // the partitions memory so to avoid double counting we only
-      // count partitions memory.
-      result->chrome_dump.partition_alloc_total_kb =
-          GetDumpsSumKb("partition_alloc/partitions/*", process_memory_dump);
-      result->chrome_dump.blink_gc_total_kb =
-          GetDumpsSumKb("blink_gc", process_memory_dump);
-      FillOsDumpFromProcessMemoryDump(process_memory_dump, &result->os_dump);
-    } else {
-      auto& os_dump = result->extra_processes_dumps[pid];
-      FillOsDumpFromProcessMemoryDump(process_memory_dump, &os_dump);
-    }
-  }
-
   if (!pmd_async_state->callback.is_null()) {
-    pmd_async_state->callback.Run(dump_successful, dump_guid, result);
+    pmd_async_state->callback.Run(pmd_async_state->dump_successful, dump_guid,
+                                  std::move(pmd_async_state->process_dumps));
     pmd_async_state->callback.Reset();
   }
 
diff --git a/base/trace_event/memory_dump_manager.h b/base/trace_event/memory_dump_manager.h
index 1460562..b92f0ba 100644
--- a/base/trace_event/memory_dump_manager.h
+++ b/base/trace_event/memory_dump_manager.h
@@ -32,7 +32,6 @@
 
 namespace trace_event {
 
-class MemoryTracingObserver;
 class MemoryDumpProvider;
 class HeapProfilerSerializationState;
 
@@ -288,8 +287,6 @@
   scoped_refptr<HeapProfilerSerializationState>
       heap_profiler_serialization_state_;
 
-  std::unique_ptr<MemoryTracingObserver> tracing_observer_;
-
   // Function provided by the embedder to handle global dump requests.
   RequestGlobalDumpFunction request_dump_function_;
 
diff --git a/base/trace_event/memory_dump_manager_unittest.cc b/base/trace_event/memory_dump_manager_unittest.cc
index 2f8d74d..4baa0429 100644
--- a/base/trace_event/memory_dump_manager_unittest.cc
+++ b/base/trace_event/memory_dump_manager_unittest.cc
@@ -209,7 +209,7 @@
     ProcessMemoryDumpCallback callback = Bind(
         [](bool* curried_success, Closure curried_quit_closure,
            uint64_t curried_expected_guid, bool success, uint64_t dump_guid,
-           const Optional<MemoryDumpCallbackResult>& callback_result) {
+           const ProcessMemoryDumpsMap& process_dumps) {
           *curried_success = success;
           EXPECT_EQ(curried_expected_guid, dump_guid);
           ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
@@ -223,17 +223,15 @@
   }
 
   void EnableForTracing() {
-    TraceLog::GetInstance()->SetEnabled(
-        TraceConfig(MemoryDumpManager::kTraceCategory, ""),
-        TraceLog::RECORDING_MODE);
+    mdm_->SetupForTracing(TraceConfig::MemoryDumpConfig());
   }
 
   void EnableForTracingWithTraceConfig(const std::string trace_config_string) {
-    TraceLog::GetInstance()->SetEnabled(TraceConfig(trace_config_string),
-                                        TraceLog::RECORDING_MODE);
+    TraceConfig trace_config(trace_config_string);
+    mdm_->SetupForTracing(trace_config.memory_dump_config());
   }
 
-  void DisableTracing() { TraceLog::GetInstance()->SetDisabled(); }
+  void DisableTracing() { mdm_->TeardownForTracing(); }
 
   int GetMaxConsecutiveFailuresCount() const {
     return MemoryDumpManager::kMaxConsecutiveFailuresCount;
@@ -731,8 +729,8 @@
   MockMemoryDumpProvider mdp;
   RegisterDumpProvider(&mdp, nullptr);
   EXPECT_CALL(mdp, OnMemoryDump(_, _));
-  EXPECT_FALSE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED,
-                                         MemoryDumpLevelOfDetail::DETAILED));
+  EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED,
+                                        MemoryDumpLevelOfDetail::DETAILED));
 }
 
 TEST_F(MemoryDumpManagerTest, SummaryOnlyWhitelisting) {
diff --git a/base/trace_event/memory_dump_request_args.h b/base/trace_event/memory_dump_request_args.h
index afad8cb..84d5fa4 100644
--- a/base/trace_event/memory_dump_request_args.h
+++ b/base/trace_event/memory_dump_request_args.h
@@ -10,6 +10,7 @@
 
 #include <stdint.h>
 #include <map>
+#include <memory>
 #include <string>
 
 #include "base/base_export.h"
@@ -21,6 +22,8 @@
 namespace base {
 namespace trace_event {
 
+class ProcessMemoryDump;
+
 // Captures the reason why a memory dump is being requested. This is to allow
 // selective enabling of dumps, filtering and post-processing. Keep this
 // consistent with memory_instrumentation.mojo and
@@ -110,10 +113,14 @@
 using GlobalMemoryDumpCallback =
     Callback<void(bool success, uint64_t dump_guid)>;
 
+// TODO(ssid): This should just sent a single PMD once the support for multi
+// process dumps are removed from MemoryDumpManager.
+using ProcessMemoryDumpsMap =
+    std::map<ProcessId, std::unique_ptr<ProcessMemoryDump>>;
 using ProcessMemoryDumpCallback =
     Callback<void(bool success,
                   uint64_t dump_guid,
-                  const Optional<MemoryDumpCallbackResult>& result)>;
+                  const ProcessMemoryDumpsMap& process_dumps)>;
 
 BASE_EXPORT const char* MemoryDumpTypeToString(const MemoryDumpType& dump_type);
 
diff --git a/base/trace_event/memory_tracing_observer.cc b/base/trace_event/memory_tracing_observer.cc
deleted file mode 100644
index a9659b2..0000000
--- a/base/trace_event/memory_tracing_observer.cc
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/trace_event/memory_tracing_observer.h"
-
-#include "base/memory/ptr_util.h"
-#include "base/trace_event/memory_dump_manager.h"
-#include "base/trace_event/trace_event_argument.h"
-
-namespace base {
-namespace trace_event {
-
-namespace {
-
-const int kTraceEventNumArgs = 1;
-const char* kTraceEventArgNames[] = {"dumps"};
-const unsigned char kTraceEventArgTypes[] = {TRACE_VALUE_TYPE_CONVERTABLE};
-
-bool IsMemoryInfraTracingEnabled() {
-  bool enabled;
-  TRACE_EVENT_CATEGORY_GROUP_ENABLED(MemoryDumpManager::kTraceCategory,
-                                     &enabled);
-  return enabled;
-}
-
-};  // namespace
-
-MemoryTracingObserver::MemoryTracingObserver(
-    TraceLog* trace_log,
-    MemoryDumpManager* memory_dump_manager)
-    : memory_dump_manager_(memory_dump_manager), trace_log_(trace_log) {
-  // If tracing was enabled before initializing MemoryDumpManager, we missed the
-  // OnTraceLogEnabled() event. Synthesize it so we can late-join the party.
-  // IsEnabled is called before adding observer to avoid calling
-  // OnTraceLogEnabled twice.
-  bool is_tracing_already_enabled = trace_log_->IsEnabled();
-  trace_log_->AddEnabledStateObserver(this);
-  if (is_tracing_already_enabled)
-    OnTraceLogEnabled();
-}
-
-MemoryTracingObserver::~MemoryTracingObserver() {
-  trace_log_->RemoveEnabledStateObserver(this);
-}
-
-void MemoryTracingObserver::OnTraceLogEnabled() {
-  if (!IsMemoryInfraTracingEnabled())
-    return;
-
-  // Initialize the TraceLog for the current thread. This is to avoids that the
-  // TraceLog memory dump provider is registered lazily during the MDM
-  // SetupForTracing().
-  TraceLog::GetInstance()->InitializeThreadLocalEventBufferIfSupported();
-
-  const TraceConfig& trace_config =
-      TraceLog::GetInstance()->GetCurrentTraceConfig();
-  const TraceConfig::MemoryDumpConfig& memory_dump_config =
-      trace_config.memory_dump_config();
-
-  memory_dump_config_ =
-      MakeUnique<TraceConfig::MemoryDumpConfig>(memory_dump_config);
-
-  memory_dump_manager_->SetupForTracing(memory_dump_config);
-}
-
-void MemoryTracingObserver::OnTraceLogDisabled() {
-  memory_dump_manager_->TeardownForTracing();
-  memory_dump_config_.reset();
-}
-
-bool MemoryTracingObserver::AddDumpToTraceIfEnabled(
-    const MemoryDumpRequestArgs* req_args,
-    const ProcessId pid,
-    const ProcessMemoryDump* process_memory_dump) {
-  // If tracing has been disabled early out to avoid the cost of serializing the
-  // dump then ignoring the result.
-  if (!IsMemoryInfraTracingEnabled())
-    return false;
-  // If the dump mode is too detailed don't add to trace to avoid accidentally
-  // including PII.
-  if (!IsDumpModeAllowed(req_args->level_of_detail))
-    return false;
-
-  CHECK_NE(MemoryDumpType::SUMMARY_ONLY, req_args->dump_type);
-
-  const uint64_t dump_guid = req_args->dump_guid;
-
-  std::unique_ptr<TracedValue> traced_value(new TracedValue);
-  process_memory_dump->AsValueInto(traced_value.get());
-  traced_value->SetString("level_of_detail", MemoryDumpLevelOfDetailToString(
-                                                 req_args->level_of_detail));
-  const char* const event_name = MemoryDumpTypeToString(req_args->dump_type);
-
-  std::unique_ptr<ConvertableToTraceFormat> event_value(
-      std::move(traced_value));
-  TRACE_EVENT_API_ADD_TRACE_EVENT_WITH_PROCESS_ID(
-      TRACE_EVENT_PHASE_MEMORY_DUMP,
-      TraceLog::GetCategoryGroupEnabled(MemoryDumpManager::kTraceCategory),
-      event_name, trace_event_internal::kGlobalScope, dump_guid, pid,
-      kTraceEventNumArgs, kTraceEventArgNames, kTraceEventArgTypes,
-      nullptr /* arg_values */, &event_value, TRACE_EVENT_FLAG_HAS_ID);
-
-  return true;
-}
-
-bool MemoryTracingObserver::IsDumpModeAllowed(
-    MemoryDumpLevelOfDetail dump_mode) const {
-  if (!memory_dump_config_)
-    return false;
-  return memory_dump_config_->allowed_dump_modes.count(dump_mode) != 0;
-}
-
-}  // namespace trace_event
-}  // namespace base
diff --git a/base/trace_event/memory_tracing_observer.h b/base/trace_event/memory_tracing_observer.h
deleted file mode 100644
index 1127676..0000000
--- a/base/trace_event/memory_tracing_observer.h
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_TRACE_EVENT_MEMORY_TRACING_OBSERVER_H_
-#define BASE_TRACE_EVENT_MEMORY_TRACING_OBSERVER_H_
-
-#include "base/macros.h"
-#include "base/trace_event/memory_dump_manager.h"
-#include "base/trace_event/trace_event.h"
-
-namespace base {
-
-namespace trace_event {
-
-// Observes TraceLog for Enable/Disable events and when they occur Enables and
-// Disables the MemoryDumpManager with the correct state based on reading the
-// trace log. Also provides a method for adding a dump to the trace.
-class BASE_EXPORT MemoryTracingObserver
-    : public TraceLog::EnabledStateObserver {
- public:
-  static const char* const kTraceCategory;
-
-  MemoryTracingObserver(TraceLog*, MemoryDumpManager*);
-  ~MemoryTracingObserver() override;
-
-  // TraceLog::EnabledStateObserver implementation.
-  void OnTraceLogEnabled() override;
-  void OnTraceLogDisabled() override;
-
-  bool AddDumpToTraceIfEnabled(const MemoryDumpRequestArgs*,
-                               const ProcessId,
-                               const ProcessMemoryDump*);
-
- private:
-  // Returns true if the dump mode is allowed for current tracing session.
-  bool IsDumpModeAllowed(MemoryDumpLevelOfDetail) const;
-
-  MemoryDumpManager* const memory_dump_manager_;
-  TraceLog* const trace_log_;
-  std::unique_ptr<TraceConfig::MemoryDumpConfig> memory_dump_config_;
-
-  DISALLOW_COPY_AND_ASSIGN(MemoryTracingObserver);
-};
-
-}  // namespace trace_event
-}  // namespace base
-
-#endif  // BASE_TRACE_EVENT_MEMORY_TRACING_OBSERVER_H_
diff --git a/base/win/startup_information.cc b/base/win/startup_information.cc
index aff52eb..9986674 100644
--- a/base/win/startup_information.cc
+++ b/base/win/startup_information.cc
@@ -5,7 +5,6 @@
 #include "base/win/startup_information.h"
 
 #include "base/logging.h"
-#include "base/win/windows_version.h"
 
 namespace {
 
@@ -38,13 +37,6 @@
 
 StartupInformation::StartupInformation() {
   memset(&startup_info_, 0, sizeof(startup_info_));
-
-  // Pre Windows Vista doesn't support STARTUPINFOEX.
-  if (base::win::GetVersion() < base::win::VERSION_VISTA) {
-    startup_info_.StartupInfo.cb = sizeof(STARTUPINFO);
-    return;
-  }
-
   startup_info_.StartupInfo.cb = sizeof(startup_info_);
 
   // Load the attribute API functions.
diff --git a/base/win/startup_information_unittest.cc b/base/win/startup_information_unittest.cc
index 5002a22..f5d1f37 100644
--- a/base/win/startup_information_unittest.cc
+++ b/base/win/startup_information_unittest.cc
@@ -12,7 +12,6 @@
 #include "base/win/scoped_handle.h"
 #include "base/win/scoped_process_information.h"
 #include "base/win/startup_information.h"
-#include "base/win/windows_version.h"
 #include "testing/multiprocess_func_list.h"
 
 const wchar_t kSectionName[] = L"EventTestSection";
@@ -36,9 +35,6 @@
 
 // Verify that only the explicitly specified event is inherited.
 TEST_F(StartupInformationTest, InheritStdOut) {
-  if (base::win::GetVersion() < base::win::VERSION_VISTA)
-    return;
-
   base::win::StartupInformation startup_info;
 
   HANDLE section = ::CreateFileMappingW(INVALID_HANDLE_VALUE, NULL,
diff --git a/base/win/win_util.cc b/base/win/win_util.cc
index d811a9e..00f4e23 100644
--- a/base/win/win_util.cc
+++ b/base/win/win_util.cc
@@ -452,6 +452,25 @@
     }
   }
 
+  // If the device is not supporting rotation, it's unlikely to be a tablet,
+  // a convertible or a detachable.
+  // See
+  // https://msdn.microsoft.com/en-us/library/windows/desktop/dn629263(v=vs.85).aspx
+  typedef decltype(GetAutoRotationState)* GetAutoRotationStateType;
+  GetAutoRotationStateType get_auto_rotation_state_func =
+      reinterpret_cast<GetAutoRotationStateType>(GetProcAddress(
+          GetModuleHandle(L"user32.dll"), "GetAutoRotationState"));
+
+  if (get_auto_rotation_state_func) {
+    AR_STATE rotation_state;
+    ZeroMemory(&rotation_state, sizeof(AR_STATE));
+    if (get_auto_rotation_state_func(&rotation_state)) {
+      if ((rotation_state & AR_NOT_SUPPORTED) || (rotation_state & AR_LAPTOP) ||
+          (rotation_state & AR_NOSENSOR))
+        return false;
+    }
+  }
+
   // PlatformRoleSlate was added in Windows 8+.
   POWER_PLATFORM_ROLE role = GetPlatformRole();
   bool mobile_power_profile = (role == PlatformRoleMobile);
@@ -468,8 +487,8 @@
       }
     } else {
       if (reason) {
-        *reason += (role == PlatformRoleMobile) ? "PlatformRoleMobile\n" :
-                                                  "PlatformRoleSlate\n";
+        *reason += (role == PlatformRoleMobile) ? "PlatformRoleMobile\n"
+                                                : "PlatformRoleSlate\n";
       }
     }
   } else {
diff --git a/base/win/win_util_unittest.cc b/base/win/win_util_unittest.cc
index fc4f6490..db6f7ef0 100644
--- a/base/win/win_util_unittest.cc
+++ b/base/win/win_util_unittest.cc
@@ -8,7 +8,6 @@
 #include "base/macros.h"
 #include "base/scoped_native_library.h"
 #include "base/win/win_util.h"
-#include "base/win/windows_version.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace base {
@@ -31,14 +30,10 @@
 
 }  // namespace
 
-// The test is somewhat silly, because the Vista bots some have UAC enabled
-// and some have it disabled. At least we check that it does not crash.
+// The test is somewhat silly, because some bots some have UAC enabled and some
+// have it disabled. At least we check that it does not crash.
 TEST(BaseWinUtilTest, TestIsUACEnabled) {
-  if (GetVersion() >= base::win::VERSION_VISTA) {
-    UserAccountControlIsEnabled();
-  } else {
-    EXPECT_TRUE(UserAccountControlIsEnabled());
-  }
+  UserAccountControlIsEnabled();
 }
 
 TEST(BaseWinUtilTest, TestGetUserSidString) {
diff --git a/base/win/windows_version.h b/base/win/windows_version.h
index ed4fe8c3..cd27da9 100644
--- a/base/win/windows_version.h
+++ b/base/win/windows_version.h
@@ -32,7 +32,7 @@
   VERSION_WIN7 = 4,         // Also includes Windows Server 2008 R2.
   VERSION_WIN8 = 5,         // Also includes Windows Server 2012.
   VERSION_WIN8_1 = 6,       // Also includes Windows Server 2012 R2.
-  VERSION_WIN10 = 7,        // Also includes Windows 10 Server.
+  VERSION_WIN10 = 7,        // Threshold 1: Version 1507, Build 10240.
   VERSION_WIN10_TH2 = 8,    // Threshold 2: Version 1511, Build 10586.
   VERSION_WIN10_RS1 = 9,    // Redstone 1: Version 1607, Build 14393.
   VERSION_WIN10_RS2 = 10,   // Redstone 2: Version 1703, Build 15063.
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index 2782cad..6d33ce8 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -1085,9 +1085,10 @@
   } else {
     if (is_mac && !is_nacl) {
       # When compiling Objective-C, warns if a method is used whose
-      # availability is newer than the deployment target. This is not
-      # required when compiling Chrome for iOS.
-      cflags += [ "-Wpartial-availability" ]
+      # availability is newer than the deployment target.
+      # TODO(thakis): Consider enabling this on iOS too,
+      # https://crbug.com/742498
+      cflags += [ "-Wunguarded-availability" ]
     }
 
     if (is_ios) {
diff --git a/build/config/mac/mac_sdk.gni b/build/config/mac/mac_sdk.gni
index 9bb5c9f..5aa4ef17 100644
--- a/build/config/mac/mac_sdk.gni
+++ b/build/config/mac/mac_sdk.gni
@@ -73,7 +73,7 @@
 xcode_build = _mac_sdk_result.xcode_build
 machine_os_build = _mac_sdk_result.machine_os_build
 
-if (mac_sdk_version != mac_sdk_min_build_override &&
+if (mac_sdk_version != mac_sdk_min &&
     exec_script("//build/check_return_value.py",
                 [
                   "test",
@@ -89,7 +89,7 @@
   print(
       "          either upgrade Xcode to the latest version or install the Mac OS X")
   print(
-      "          $mac_sdk_min_build_override SDK. For more information, see https://crbug.com/620127.")
+      "          $mac_sdk_min SDK. For more information, see https://crbug.com/620127.")
   print()
   print(" Current SDK Version:   $mac_sdk_version")
   print(" Current Xcode Version: $xcode_version ($xcode_build)")
diff --git a/build/config/mac/mac_sdk_overrides.gni b/build/config/mac/mac_sdk_overrides.gni
index 88d24ef..2c89492 100644
--- a/build/config/mac/mac_sdk_overrides.gni
+++ b/build/config/mac/mac_sdk_overrides.gni
@@ -5,18 +5,18 @@
 # This file contains arguments that subprojects may choose to override. It
 # asserts that those overrides are used, to prevent unused args warnings.
 
-# See https://bugs.chromium.org/p/webrtc/issues/detail?id=5453.
-# We can drop the rtc_require_mac_10_7_deployment flag when Chromium
-# also requires a 10.7 deployment target.
-import("//build_overrides/build.gni")
-
+_sdk_min_from_env = getenv("FORCE_MAC_SDK_MIN")
 declare_args() {
   # Minimum supported version of the Mac SDK.
-  mac_sdk_min = mac_sdk_min_build_override
+  if (_sdk_min_from_env == "") {
+    mac_sdk_min = "10.10"
+  } else {
+    mac_sdk_min = _sdk_min_from_env
+  }
 }
 
 # Always assert that mac_sdk_min is used on non-macOS platforms to prevent
 # unused args warnings.
 if (!is_mac) {
-  assert(mac_sdk_min == mac_sdk_min_build_override || true)
+  assert(mac_sdk_min == "10.10" || true)
 }
diff --git a/build/fuchsia/test_runner.py b/build/fuchsia/test_runner.py
index 2c0395e8..5392f22 100755
--- a/build/fuchsia/test_runner.py
+++ b/build/fuchsia/test_runner.py
@@ -100,10 +100,8 @@
     raise Exception('%s does not exist' % source)
 
 
-def BuildBootfs(output_directory, runtime_deps_path, test_name, gtest_filter,
-                gtest_repeat, test_launcher_batch_limit,
-                test_launcher_filter_file, test_launcher_jobs,
-                single_process_tests, dry_run):
+def BuildBootfs(output_directory, runtime_deps_path, test_name, child_args,
+                test_launcher_filter_file, dry_run):
   with open(runtime_deps_path) as f:
     lines = f.readlines()
 
@@ -129,39 +127,25 @@
     target_source_pairs.append(
         ('lib/' + lib, os.path.join(sysroot_lib_path, lib)))
 
-  # Generate a little script that runs the test binaries and then shuts down
-  # QEMU.
-  autorun_file = tempfile.NamedTemporaryFile()
-  autorun_file.write('#!/bin/sh\n')
-  autorun_file.write('/system/' + os.path.basename(test_name))
-  autorun_file.write(' --test-launcher-retry-limit=0')
-
-  if int(os.environ.get('CHROME_HEADLESS', 0)) != 0:
-    # When running on bots (without KVM) execution is quite slow. The test
-    # launcher times out a subprocess after 45s which can be too short. Make the
-    # timeout twice as long.
-    autorun_file.write(' --test-launcher-timeout=90000')
-  if single_process_tests:
-    autorun_file.write(' --single-process-tests')
   if test_launcher_filter_file:
     test_launcher_filter_file = os.path.normpath(
             os.path.join(output_directory, test_launcher_filter_file))
     filter_file_on_device = MakeTargetImageName(
           common_prefix, output_directory, test_launcher_filter_file)
-    autorun_file.write(' --test-launcher-filter-file=/system/' +
+    child_args.append('--test-launcher-filter-file=/system/' +
                        filter_file_on_device)
     target_source_pairs.append(
         [filter_file_on_device, test_launcher_filter_file])
-  if test_launcher_batch_limit:
-    autorun_file.write(' --test-launcher-batch-limit=%d' %
-                       test_launcher_batch_limit)
-  if test_launcher_jobs:
-    autorun_file.write(' --test-launcher-jobs=%d' %
-                       test_launcher_jobs)
-  if gtest_filter:
-    autorun_file.write(' --gtest_filter=' + gtest_filter)
-  if gtest_repeat:
-    autorun_file.write(' --gtest_repeat=' + gtest_repeat)
+
+  # Generate a little script that runs the test binaries and then shuts down
+  # QEMU.
+  autorun_file = tempfile.NamedTemporaryFile()
+  autorun_file.write('#!/bin/sh\n')
+  autorun_file.write('/system/' + os.path.basename(test_name))
+
+  for arg in child_args:
+    autorun_file.write(' "%s"' % arg);
+
   autorun_file.write('\n')
   # If shutdown happens too soon after the test completion, log statements from
   # the end of the run will be lost, so sleep for a bit before shutting down.
@@ -241,13 +225,37 @@
                       help='Sets the number of parallel test jobs.')
   parser.add_argument('--test_launcher_summary_output',
                       help='Currently ignored for 2-sided roll.')
+  parser.add_argument('child_args', nargs='*',
+                      help='Arguments for the test process.')
   args = parser.parse_args()
 
+  child_args = ['--test-launcher-retry-limit=0']
+
+  if int(os.environ.get('CHROME_HEADLESS', 0)) != 0:
+    # When running on bots (without KVM) execution is quite slow. The test
+    # launcher times out a subprocess after 45s which can be too short. Make the
+    # timeout twice as long.
+    child_args.append('--test-launcher-timeout=90000')
+
+  if args.single_process_tests:
+    child_args.append('--single-process-tests')
+
+  if args.test_launcher_batch_limit:
+    child_args.append('--test-launcher-batch-limit=%d' %
+                       args.test_launcher_batch_limit)
+  if args.test_launcher_jobs:
+    child_args.append('--test-launcher-jobs=%d' %
+                       args.test_launcher_jobs)
+  if args.gtest_filter:
+    child_args.append('--gtest_filter=' + args.gtest_filter)
+  if args.gtest_repeat:
+    child_args.append('--gtest_repeat=' + args.gtest_repeat)
+  if args.child_args:
+    child_args.extend(args.child_args)
+
   bootfs = BuildBootfs(args.output_directory, args.runtime_deps_path,
-                       args.test_name, args.gtest_filter, args.gtest_repeat,
-                       args.test_launcher_batch_limit,
-                       args.test_launcher_filter_file, args.test_launcher_jobs,
-                       args.single_process_tests, args.dry_run)
+                       args.test_name, child_args,
+                       args.test_launcher_filter_file, args.dry_run)
 
   qemu_path = os.path.join(SDK_ROOT, 'qemu', 'bin', 'qemu-system-x86_64')
 
@@ -259,7 +267,15 @@
        '-machine', 'q35',
        '-kernel', os.path.join(SDK_ROOT, 'kernel', 'magenta.bin'),
        '-initrd', bootfs,
-       '-append', 'TERM=xterm-256color kernel.halt_on_panic=true']
+
+       # Use stdio for the guest OS only; don't attach the QEMU interactive
+       # monitor.
+       '-serial', 'stdio',
+       '-monitor', 'none',
+
+       # TERM=dumb tells the guest OS to not emit ANSI commands that trigger
+       # noisy ANSI spew from the user's terminal emulator.
+       '-append', 'TERM=dumb kernel.halt_on_panic=true']
   if int(os.environ.get('CHROME_HEADLESS', 0)) == 0:
     qemu_command += ['-enable-kvm', '-cpu', 'host,migratable=no']
   else:
@@ -272,7 +288,15 @@
     bt_with_offset_re = re.compile(prefix +
         'bt#(\d+): pc 0x[0-9a-f]+ sp (0x[0-9a-f]+) \((\S+),(0x[0-9a-f]+)\)$')
     bt_end_re = re.compile(prefix + 'bt#(\d+): end')
-    qemu_popen = subprocess.Popen(qemu_command, stdout=subprocess.PIPE)
+
+    # We pass a separate stdin stream to qemu. Sharing stdin across processes
+    # leads to flakiness due to the OS prematurely killing the stream and the
+    # Python script panicking and aborting.
+    # The precise root cause is still nebulous, but this fix works.
+    # See crbug.com/741194 .
+    qemu_popen = subprocess.Popen(
+        qemu_command, stdout=subprocess.PIPE, stdin=open(os.devnull))
+
     processed_lines = []
     success = False
     while True:
@@ -301,6 +325,7 @@
               '(inlined', ' ' * len(prefix) + '(inlined')
           processed_lines.append('%s%s' % (prefix, addr2line_filtered))
     qemu_popen.wait()
+
     return 0 if success else 1
 
   return 0
diff --git a/build_overrides/build.gni b/build_overrides/build.gni
index c08c8c41..aa6fcfb 100644
--- a/build_overrides/build.gni
+++ b/build_overrides/build.gni
@@ -2,17 +2,6 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-# Several dependencies of Chrome require a different min sdk when built
-# as stand-alone projects. If this is ever not the case, these variables
-# can be removed.
-# See https://bugs.chromium.org/p/webrtc/issues/detail?id=5453.
-_sdk_min_from_env = getenv("FORCE_MAC_SDK_MIN")
-if (_sdk_min_from_env == "") {
-  mac_sdk_min_build_override = "10.10"
-} else {
-  mac_sdk_min_build_override = _sdk_min_from_env
-}
-
 # Variable that can be used to support multiple build scenarios, like having
 # Chromium specific targets in a client project's GN file etc.
 build_with_chromium = true
diff --git a/cc/BUILD.gn b/cc/BUILD.gn
index 359e2e2..606d9fe 100644
--- a/cc/BUILD.gn
+++ b/cc/BUILD.gn
@@ -839,9 +839,6 @@
     "animation/keyframed_animation_curve_unittest.cc",
     "animation/scroll_offset_animation_curve_unittest.cc",
     "animation/transform_operations_unittest.cc",
-
-    # Surfaces test files.
-    "surfaces/frame_sink_manager_unittest.cc",
     "surfaces/referenced_surface_tracker_unittest.cc",
     "surfaces/surface_hittest_unittest.cc",
     "surfaces/surface_manager_ref_unittest.cc",
diff --git a/cc/base/math_util.cc b/cc/base/math_util.cc
index 53dde152..5f7544c0 100644
--- a/cc/base/math_util.cc
+++ b/cc/base/math_util.cc
@@ -7,7 +7,7 @@
 #include <algorithm>
 #include <cmath>
 #include <limits>
-#ifdef __SSE__
+#if defined(ARCH_CPU_X86_FAMILY)
 #include <xmmintrin.h>
 #endif
 
@@ -810,7 +810,7 @@
 }
 
 ScopedSubnormalFloatDisabler::ScopedSubnormalFloatDisabler() {
-#ifdef __SSE__
+#if defined(ARCH_CPU_X86_FAMILY)
   // Turn on "subnormals are zero" and "flush to zero" CSR flags.
   orig_state_ = _mm_getcsr();
   _mm_setcsr(orig_state_ | 0x8040);
@@ -818,7 +818,7 @@
 }
 
 ScopedSubnormalFloatDisabler::~ScopedSubnormalFloatDisabler() {
-#ifdef __SSE__
+#if defined(ARCH_CPU_X86_FAMILY)
   _mm_setcsr(orig_state_);
 #endif
 }
diff --git a/cc/base/math_util.h b/cc/base/math_util.h
index 8052b07..dd3dd89 100644
--- a/cc/base/math_util.h
+++ b/cc/base/math_util.h
@@ -11,6 +11,7 @@
 #include <vector>
 
 #include "base/logging.h"
+#include "build/build_config.h"
 #include "cc/base/base_export.h"
 #include "ui/gfx/geometry/box_f.h"
 #include "ui/gfx/geometry/point3_f.h"
@@ -330,7 +331,7 @@
   ~ScopedSubnormalFloatDisabler();
 
  private:
-#ifdef __SSE__
+#if defined(ARCH_CPU_X86_FAMILY)
   unsigned int orig_state_;
 #endif
   DISALLOW_COPY_AND_ASSIGN(ScopedSubnormalFloatDisabler);
diff --git a/cc/ipc/BUILD.gn b/cc/ipc/BUILD.gn
index 67c496e..b5598a28 100644
--- a/cc/ipc/BUILD.gn
+++ b/cc/ipc/BUILD.gn
@@ -59,7 +59,6 @@
     "shared_quad_state.mojom",
     "surface_id.mojom",
     "surface_info.mojom",
-    "surface_reference.mojom",
     "surface_sequence.mojom",
     "texture_mailbox.mojom",
     "texture_mailbox_releaser.mojom",
diff --git a/cc/ipc/struct_traits_unittest.cc b/cc/ipc/struct_traits_unittest.cc
index a41fe7c..b93dc49 100644
--- a/cc/ipc/struct_traits_unittest.cc
+++ b/cc/ipc/struct_traits_unittest.cc
@@ -107,11 +107,6 @@
     std::move(callback).Run(s);
   }
 
-  void EchoSurfaceReference(const SurfaceReference& s,
-                            EchoSurfaceReferenceCallback callback) override {
-    std::move(callback).Run(s);
-  }
-
   void EchoSurfaceSequence(const SurfaceSequence& s,
                            EchoSurfaceSequenceCallback callback) override {
     std::move(callback).Run(s);
@@ -1033,24 +1028,6 @@
   EXPECT_EQ(local_surface_id, output.local_surface_id());
 }
 
-TEST_F(StructTraitsTest, SurfaceReference) {
-  const viz::SurfaceId parent_id(
-      viz::FrameSinkId(2016, 1234),
-      viz::LocalSurfaceId(0xfbadbeef,
-                          base::UnguessableToken::Deserialize(123, 456)));
-  const viz::SurfaceId child_id(
-      viz::FrameSinkId(1111, 9999),
-      viz::LocalSurfaceId(0xabcdabcd,
-                          base::UnguessableToken::Deserialize(333, 333)));
-  const SurfaceReference input(parent_id, child_id);
-
-  mojom::TraitsTestServicePtr proxy = GetTraitsTestProxy();
-  SurfaceReference output;
-  proxy->EchoSurfaceReference(input, &output);
-  EXPECT_EQ(parent_id, output.parent_id());
-  EXPECT_EQ(child_id, output.child_id());
-}
-
 TEST_F(StructTraitsTest, SurfaceSequence) {
   const viz::FrameSinkId frame_sink_id(2016, 1234);
   const uint32_t sequence = 0xfbadbeef;
diff --git a/cc/ipc/surface_reference.mojom b/cc/ipc/surface_reference.mojom
deleted file mode 100644
index ecdd7ed..0000000
--- a/cc/ipc/surface_reference.mojom
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module cc.mojom;
-
-import "cc/ipc/surface_id.mojom";
-
-struct SurfaceReference {
-  SurfaceId parent_id;
-  SurfaceId child_id;
-};
diff --git a/cc/ipc/surface_reference.typemap b/cc/ipc/surface_reference.typemap
deleted file mode 100644
index 63bff2d..0000000
--- a/cc/ipc/surface_reference.typemap
+++ /dev/null
@@ -1,8 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-mojom = "//cc/ipc/surface_reference.mojom"
-public_headers = [ "//cc/surfaces/surface_reference.h" ]
-traits_headers = [ "//cc/ipc/surface_reference_struct_traits.h" ]
-type_mappings = [ "cc.mojom.SurfaceReference=cc::SurfaceReference" ]
diff --git a/cc/ipc/surface_reference_struct_traits.h b/cc/ipc/surface_reference_struct_traits.h
deleted file mode 100644
index 170f55e..0000000
--- a/cc/ipc/surface_reference_struct_traits.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CC_IPC_SURFACE_REFERENCE_STRUCT_TRAITS_H_
-#define CC_IPC_SURFACE_REFERENCE_STRUCT_TRAITS_H_
-
-#include "cc/ipc/surface_id_struct_traits.h"
-#include "cc/ipc/surface_reference.mojom-shared.h"
-#include "cc/surfaces/surface_reference.h"
-#include "components/viz/common/surfaces/surface_id.h"
-
-namespace mojo {
-
-template <>
-struct StructTraits<cc::mojom::SurfaceReferenceDataView, cc::SurfaceReference> {
-  static const viz::SurfaceId& parent_id(const cc::SurfaceReference& ref) {
-    return ref.parent_id();
-  }
-
-  static const viz::SurfaceId& child_id(const cc::SurfaceReference& ref) {
-    return ref.child_id();
-  }
-
-  static bool Read(cc::mojom::SurfaceReferenceDataView data,
-                   cc::SurfaceReference* out) {
-    return data.ReadParentId(&out->parent_id_) &&
-           data.ReadChildId(&out->child_id_);
-  }
-};
-
-}  // namespace mojo
-
-#endif  // CC_IPC_SURFACE_REFERENCE_STRUCT_TRAITS_H_
diff --git a/cc/ipc/traits_test_service.mojom b/cc/ipc/traits_test_service.mojom
index 0f994dc6..71d2064 100644
--- a/cc/ipc/traits_test_service.mojom
+++ b/cc/ipc/traits_test_service.mojom
@@ -17,7 +17,6 @@
 import "cc/ipc/selection.mojom";
 import "cc/ipc/shared_quad_state.mojom";
 import "cc/ipc/surface_id.mojom";
-import "cc/ipc/surface_reference.mojom";
 import "cc/ipc/surface_sequence.mojom";
 import "cc/ipc/texture_mailbox.mojom";
 import "cc/ipc/transferable_resource.mojom";
@@ -66,9 +65,6 @@
   EchoSurfaceId(SurfaceId s) => (SurfaceId pass);
 
   [Sync]
-  EchoSurfaceReference(SurfaceReference r) => (SurfaceReference pass);
-
-  [Sync]
   EchoSurfaceSequence(SurfaceSequence s) => (SurfaceSequence pass);
 
   [Sync]
diff --git a/cc/ipc/typemaps.gni b/cc/ipc/typemaps.gni
index 62286b24..cca6caa 100644
--- a/cc/ipc/typemaps.gni
+++ b/cc/ipc/typemaps.gni
@@ -18,7 +18,6 @@
   "//cc/ipc/shared_quad_state.typemap",
   "//cc/ipc/surface_id.typemap",
   "//cc/ipc/surface_info.typemap",
-  "//cc/ipc/surface_reference.typemap",
   "//cc/ipc/surface_sequence.typemap",
   "//cc/ipc/texture_mailbox.typemap",
   "//cc/ipc/transferable_resource.typemap",
diff --git a/cc/paint/paint_op_buffer.cc b/cc/paint/paint_op_buffer.cc
index 907f4e9..86afd67 100644
--- a/cc/paint/paint_op_buffer.cc
+++ b/cc/paint/paint_op_buffer.cc
@@ -1495,7 +1495,8 @@
 
 DrawTextBlobOp::~DrawTextBlobOp() = default;
 
-PaintOpBuffer::PaintOpBuffer() = default;
+PaintOpBuffer::PaintOpBuffer()
+    : has_non_aa_paint_(false), has_discardable_images_(false) {}
 
 PaintOpBuffer::PaintOpBuffer(PaintOpBuffer&& other) {
   *this = std::move(other);
diff --git a/cc/paint/paint_op_buffer.h b/cc/paint/paint_op_buffer.h
index fbbb65d6c..4d7560c 100644
--- a/cc/paint/paint_op_buffer.h
+++ b/cc/paint/paint_op_buffer.h
@@ -1179,10 +1179,11 @@
 
   // Record paths for veto-to-msaa for gpu raster.
   int num_slow_paths_ = 0;
-  bool has_non_aa_paint_ = false;
   // Record additional bytes used by referenced sub-records and display lists.
   size_t subrecord_bytes_used_ = 0;
-  bool has_discardable_images_ = false;
+
+  bool has_non_aa_paint_ : 1;
+  bool has_discardable_images_ : 1;
 
   DISALLOW_COPY_AND_ASSIGN(PaintOpBuffer);
 };
diff --git a/cc/surfaces/BUILD.gn b/cc/surfaces/BUILD.gn
index 6e6b7ce..4dfcc177 100644
--- a/cc/surfaces/BUILD.gn
+++ b/cc/surfaces/BUILD.gn
@@ -28,9 +28,6 @@
   sources = [
     "direct_surface_reference_factory.cc",
     "direct_surface_reference_factory.h",
-    "frame_sink_manager.cc",
-    "frame_sink_manager.h",
-    "frame_sink_manager_client.h",
     "primary_begin_frame_source.cc",
     "primary_begin_frame_source.h",
     "referenced_surface_tracker.cc",
diff --git a/cc/surfaces/frame_sink_manager.h b/cc/surfaces/frame_sink_manager.h
deleted file mode 100644
index 55d957b..0000000
--- a/cc/surfaces/frame_sink_manager.h
+++ /dev/null
@@ -1,138 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CC_SURFACES_FRAME_SINK_MANAGER_H_
-#define CC_SURFACES_FRAME_SINK_MANAGER_H_
-
-#include <stdint.h>
-
-#include <unordered_map>
-#include <vector>
-
-#include "base/containers/flat_map.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "cc/surfaces/primary_begin_frame_source.h"
-#include "cc/surfaces/surface_manager.h"
-#include "cc/surfaces/surfaces_export.h"
-#include "components/viz/common/surfaces/frame_sink_id.h"
-
-namespace cc {
-class BeginFrameSource;
-class FrameSinkManagerClient;
-
-namespace test {
-class CompositorFrameSinkSupportTest;
-class SurfaceSynchronizationTest;
-}
-
-// FrameSinkManager manages BeginFrame hierarchy. This is the implementation
-// detail for FrameSinkManagerImpl.
-// TODO(staraz): Merge FrameSinkManager into FrameSinkManagerImpl.
-class CC_SURFACES_EXPORT FrameSinkManager {
- public:
-  explicit FrameSinkManager(SurfaceManager::LifetimeType lifetime_type =
-                                SurfaceManager::LifetimeType::SEQUENCES);
-  ~FrameSinkManager();
-
-  void RegisterFrameSinkId(const viz::FrameSinkId& frame_sink_id);
-
-  // Invalidate a frame_sink_id that might still have associated sequences,
-  // possibly because a renderer process has crashed.
-  void InvalidateFrameSinkId(const viz::FrameSinkId& frame_sink_id);
-
-  // CompositorFrameSinkSupport, hierarchy, and BeginFrameSource can be
-  // registered and unregistered in any order with respect to each other.
-  //
-  // This happens in practice, e.g. the relationship to between ui::Compositor /
-  // DelegatedFrameHost is known before ui::Compositor has a surface/client).
-  // However, DelegatedFrameHost can register itself as a client before its
-  // relationship with the ui::Compositor is known.
-
-  // Associates a FrameSinkManagerClient with the frame_sink_id it uses.
-  // FrameSinkManagerClient and framesink allocators have a 1:1 mapping.
-  // Caller guarantees the client is alive between register/unregister.
-  void RegisterFrameSinkManagerClient(const viz::FrameSinkId& frame_sink_id,
-                                      FrameSinkManagerClient* client);
-  void UnregisterFrameSinkManagerClient(const viz::FrameSinkId& frame_sink_id);
-
-  // Associates a |source| with a particular framesink.  That framesink and
-  // any children of that framesink with valid clients can potentially use
-  // that |source|.
-  void RegisterBeginFrameSource(BeginFrameSource* source,
-                                const viz::FrameSinkId& frame_sink_id);
-  void UnregisterBeginFrameSource(BeginFrameSource* source);
-
-  // Returns a stable BeginFrameSource that forwards BeginFrames from the first
-  // available BeginFrameSource.
-  BeginFrameSource* GetPrimaryBeginFrameSource();
-
-  // Register a relationship between two framesinks.  This relationship means
-  // that surfaces from the child framesik will be displayed in the parent.
-  // Children are allowed to use any begin frame source that their parent can
-  // use.
-  void RegisterFrameSinkHierarchy(const viz::FrameSinkId& parent_frame_sink_id,
-                                  const viz::FrameSinkId& child_frame_sink_id);
-  void UnregisterFrameSinkHierarchy(
-      const viz::FrameSinkId& parent_frame_sink_id,
-      const viz::FrameSinkId& child_frame_sink_id);
-
-  // Drops the temporary reference for |surface_id|. If a surface reference has
-  // already been added from the parent to |surface_id| then this will do
-  // nothing.
-  void DropTemporaryReference(const viz::SurfaceId& surface_id);
-
-  SurfaceManager* surface_manager() { return &surface_manager_; }
-
- private:
-  friend class test::CompositorFrameSinkSupportTest;
-  friend class test::SurfaceSynchronizationTest;
-
-  void RecursivelyAttachBeginFrameSource(const viz::FrameSinkId& frame_sink_id,
-                                         BeginFrameSource* source);
-  void RecursivelyDetachBeginFrameSource(const viz::FrameSinkId& frame_sink_id,
-                                         BeginFrameSource* source);
-
-  // Returns true if |child framesink| is or has |search_frame_sink_id| as a
-  // child.
-  bool ChildContains(const viz::FrameSinkId& child_frame_sink_id,
-                     const viz::FrameSinkId& search_frame_sink_id) const;
-
-  // Begin frame source routing. Both BeginFrameSource and
-  // CompositorFrameSinkSupport pointers guaranteed alive by callers until
-  // unregistered.
-  struct FrameSinkSourceMapping {
-    FrameSinkSourceMapping();
-    FrameSinkSourceMapping(const FrameSinkSourceMapping& other);
-    ~FrameSinkSourceMapping();
-    bool has_children() const { return !children.empty(); }
-    // The currently assigned begin frame source for this client.
-    BeginFrameSource* source = nullptr;
-    // This represents a dag of parent -> children mapping.
-    std::vector<viz::FrameSinkId> children;
-  };
-
-  base::flat_map<viz::FrameSinkId, FrameSinkManagerClient*> clients_;
-  std::unordered_map<viz::FrameSinkId,
-                     FrameSinkSourceMapping,
-                     viz::FrameSinkIdHash>
-      frame_sink_source_map_;
-
-  // Set of BeginFrameSource along with associated FrameSinkIds. Any child
-  // that is implicitly using this framesink must be reachable by the
-  // parent in the dag.
-  std::unordered_map<BeginFrameSource*, viz::FrameSinkId> registered_sources_;
-
-  PrimaryBeginFrameSource primary_source_;
-
-  // |surface_manager_| should be placed under |primary_source_| so that all
-  // surfaces are destroyed before |primary_source_|.
-  SurfaceManager surface_manager_;
-
-  DISALLOW_COPY_AND_ASSIGN(FrameSinkManager);
-};
-
-}  // namespace cc
-
-#endif  // CC_SURFACES_FRAME_SINK_MANAGER_H_
diff --git a/cc/surfaces/frame_sink_manager_client.h b/cc/surfaces/frame_sink_manager_client.h
deleted file mode 100644
index 83784b9..0000000
--- a/cc/surfaces/frame_sink_manager_client.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-#ifndef CC_SURFACES_FRAME_SINK_MANAGER_CLIENT_H_
-#define CC_SURFACES_FRAME_SINK_MANAGER_CLIENT_H_
-
-#include "cc/scheduler/begin_frame_source.h"
-#include "cc/surfaces/surfaces_export.h"
-
-namespace cc {
-
-class CC_SURFACES_EXPORT FrameSinkManagerClient {
- public:
-  virtual ~FrameSinkManagerClient() = default;
-
-  // This allows the FrameSinkManager to pass a BeginFrameSource to use.
-  virtual void SetBeginFrameSource(BeginFrameSource* begin_frame_source) = 0;
-};
-
-}  // namespace cc
-
-#endif  // CC_SURFACES_FRAME_SINK_MANAGER_CLIENT_H_
diff --git a/cc/surfaces/primary_begin_frame_source.h b/cc/surfaces/primary_begin_frame_source.h
index a49aed04..b4b99e9 100644
--- a/cc/surfaces/primary_begin_frame_source.h
+++ b/cc/surfaces/primary_begin_frame_source.h
@@ -7,15 +7,17 @@
 
 #include "base/containers/flat_set.h"
 #include "cc/scheduler/begin_frame_source.h"
+#include "cc/surfaces/surfaces_export.h"
 
 namespace cc {
 
 // PrimaryBeginFrameSource echos the first BeginFrameSource in the system.
 // If the first source goes away then it will echo the new first
 // BeginFrameSource.
-class PrimaryBeginFrameSource : public BeginFrameSource,
-                                public BeginFrameObserver,
-                                public ExternalBeginFrameSourceClient {
+class CC_SURFACES_EXPORT PrimaryBeginFrameSource
+    : public BeginFrameSource,
+      public BeginFrameObserver,
+      public ExternalBeginFrameSourceClient {
  public:
   PrimaryBeginFrameSource();
   ~PrimaryBeginFrameSource() override;
diff --git a/cc/surfaces/surface_hittest_unittest.cc b/cc/surfaces/surface_hittest_unittest.cc
index e989a71b..ff0e674 100644
--- a/cc/surfaces/surface_hittest_unittest.cc
+++ b/cc/surfaces/surface_hittest_unittest.cc
@@ -5,7 +5,6 @@
 #include <stddef.h>
 
 #include "cc/output/compositor_frame.h"
-#include "cc/surfaces/frame_sink_manager.h"
 #include "cc/surfaces/surface.h"
 #include "cc/surfaces/surface_hittest.h"
 #include "cc/surfaces/surface_manager.h"
@@ -13,6 +12,7 @@
 #include "cc/test/surface_hittest_test_helpers.h"
 #include "components/viz/common/surfaces/local_surface_id_allocator.h"
 #include "components/viz/service/frame_sinks/compositor_frame_sink_support.h"
+#include "components/viz/service/frame_sinks/frame_sink_manager.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "ui/gfx/geometry/size.h"
@@ -66,7 +66,7 @@
 // This test verifies that hit testing on a surface that does not exist does
 // not crash.
 TEST(SurfaceHittestTest, Hittest_BadCompositorFrameDoesNotCrash) {
-  FrameSinkManager manager;
+  viz::FrameSinkManager manager;
   viz::FrameSinkId root_frame_sink_id(kArbitraryFrameSinkId);
   auto root_support = viz::CompositorFrameSinkSupport::Create(
       nullptr, &manager, kArbitraryFrameSinkId, kIsRoot,
@@ -108,7 +108,7 @@
 }
 
 TEST(SurfaceHittestTest, Hittest_SingleSurface) {
-  FrameSinkManager manager;
+  viz::FrameSinkManager manager;
 
   // Set up root FrameSink.
   viz::FrameSinkId root_frame_sink_id(1, 1);
@@ -142,7 +142,7 @@
 }
 
 TEST(SurfaceHittestTest, Hittest_ChildSurface) {
-  FrameSinkManager manager;
+  viz::FrameSinkManager manager;
 
   // Set up root FrameSink.
   viz::FrameSinkId root_frame_sink_id(1, 1);
@@ -283,7 +283,7 @@
 // This test verifies that hit testing will progress to the next quad if it
 // encounters an invalid RenderPassDrawQuad for whatever reason.
 TEST(SurfaceHittestTest, Hittest_InvalidRenderPassDrawQuad) {
-  FrameSinkManager manager;
+  viz::FrameSinkManager manager;
 
   // Set up root FrameSink.
   viz::FrameSinkId root_frame_sink_id(1, 1);
@@ -392,7 +392,7 @@
 }
 
 TEST(SurfaceHittestTest, Hittest_RenderPassDrawQuad) {
-  FrameSinkManager manager;
+  viz::FrameSinkManager manager;
   viz::FrameSinkId root_frame_sink_id(kArbitraryFrameSinkId);
   auto support = viz::CompositorFrameSinkSupport::Create(
       nullptr, &manager, root_frame_sink_id, kIsRoot,
@@ -494,7 +494,7 @@
 }
 
 TEST(SurfaceHittestTest, Hittest_SingleSurface_WithInsetsDelegate) {
-  FrameSinkManager manager;
+  viz::FrameSinkManager manager;
 
   // Set up root FrameSink.
   viz::FrameSinkId root_frame_sink_id(1, 1);
diff --git a/cc/surfaces/surface_manager_ref_unittest.cc b/cc/surfaces/surface_manager_ref_unittest.cc
index 6dfa3596..58972b0 100644
--- a/cc/surfaces/surface_manager_ref_unittest.cc
+++ b/cc/surfaces/surface_manager_ref_unittest.cc
@@ -9,12 +9,12 @@
 
 #include "base/containers/flat_set.h"
 #include "base/memory/ptr_util.h"
-#include "cc/surfaces/frame_sink_manager.h"
 #include "cc/surfaces/surface.h"
 #include "cc/surfaces/surface_manager.h"
 #include "cc/test/compositor_frame_helpers.h"
 #include "components/viz/common/surfaces/surface_id.h"
 #include "components/viz/service/frame_sinks/compositor_frame_sink_support.h"
+#include "components/viz/service/frame_sinks/frame_sink_manager.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -112,7 +112,7 @@
   // testing::Test:
   void SetUp() override {
     // Start each test with a fresh SurfaceManager instance.
-    manager_ = base::MakeUnique<FrameSinkManager>(
+    manager_ = base::MakeUnique<viz::FrameSinkManager>(
         SurfaceManager::LifetimeType::REFERENCES);
   }
   void TearDown() override {
@@ -126,7 +126,7 @@
                      std::unique_ptr<viz::CompositorFrameSinkSupport>,
                      viz::FrameSinkIdHash>
       supports_;
-  std::unique_ptr<FrameSinkManager> manager_;
+  std::unique_ptr<viz::FrameSinkManager> manager_;
 };
 
 TEST_F(SurfaceManagerRefTest, AddReference) {
diff --git a/cc/surfaces/surface_reference.h b/cc/surfaces/surface_reference.h
index d490ffc..b381a20 100644
--- a/cc/surfaces/surface_reference.h
+++ b/cc/surfaces/surface_reference.h
@@ -9,12 +9,8 @@
 
 #include "base/hash.h"
 #include "components/viz/common/surfaces/surface_id.h"
-#include "mojo/public/cpp/bindings/struct_traits.h"
 
 namespace cc {
-namespace mojom {
-class SurfaceReferenceDataView;
-}
 
 // Hold a reference from an embedding (parent) to embedded (child) surface.
 class SurfaceReference {
@@ -50,9 +46,6 @@
   std::string ToString() const;
 
  private:
-  friend struct mojo::StructTraits<mojom::SurfaceReferenceDataView,
-                                   SurfaceReference>;
-
   viz::SurfaceId parent_id_;
   viz::SurfaceId child_id_;
 };
diff --git a/cc/surfaces/surface_synchronization_unittest.cc b/cc/surfaces/surface_synchronization_unittest.cc
index acb224b..3ac3404 100644
--- a/cc/surfaces/surface_synchronization_unittest.cc
+++ b/cc/surfaces/surface_synchronization_unittest.cc
@@ -3,7 +3,6 @@
 // found in the LICENSE file.
 
 #include "base/containers/flat_set.h"
-#include "cc/surfaces/frame_sink_manager.h"
 #include "cc/test/begin_frame_args_test.h"
 #include "cc/test/compositor_frame_helpers.h"
 #include "cc/test/fake_external_begin_frame_source.h"
@@ -11,6 +10,7 @@
 #include "cc/test/mock_compositor_frame_sink_support_client.h"
 #include "components/viz/common/surfaces/surface_id.h"
 #include "components/viz/service/frame_sinks/compositor_frame_sink_support.h"
+#include "components/viz/service/frame_sinks/frame_sink_manager.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -102,7 +102,7 @@
     return support(index).GetCurrentSurfaceForTesting();
   }
 
-  FrameSinkManager& frame_sink_manager() { return frame_sink_manager_; }
+  viz::FrameSinkManager& frame_sink_manager() { return frame_sink_manager_; }
 
   // Returns all the references where |surface_id| is the parent.
   const base::flat_set<viz::SurfaceId>& GetChildReferences(
@@ -188,7 +188,7 @@
   testing::NiceMock<MockCompositorFrameSinkSupportClient> support_client_;
 
  private:
-  FrameSinkManager frame_sink_manager_;
+  viz::FrameSinkManager frame_sink_manager_;
   FakeSurfaceObserver surface_observer_;
   FakeExternalBeginFrameSourceClient begin_frame_source_client_;
   std::unique_ptr<FakeExternalBeginFrameSource> begin_frame_source_;
diff --git a/cc/surfaces/surface_unittest.cc b/cc/surfaces/surface_unittest.cc
index 6f5d9f0b..3fccb58 100644
--- a/cc/surfaces/surface_unittest.cc
+++ b/cc/surfaces/surface_unittest.cc
@@ -5,7 +5,6 @@
 #include "cc/surfaces/surface.h"
 #include "base/memory/ptr_util.h"
 #include "cc/output/copy_output_result.h"
-#include "cc/surfaces/frame_sink_manager.h"
 #include "cc/surfaces/surface_dependency_tracker.h"
 #include "cc/test/begin_frame_args_test.h"
 #include "cc/test/compositor_frame_helpers.h"
@@ -13,6 +12,7 @@
 #include "cc/test/scheduler_test_common.h"
 #include "components/viz/common/surfaces/local_surface_id_allocator.h"
 #include "components/viz/service/frame_sinks/compositor_frame_sink_support.h"
+#include "components/viz/service/frame_sinks/frame_sink_manager.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/gfx/geometry/size.h"
 
@@ -25,7 +25,7 @@
 constexpr bool kNeedsSyncPoints = true;
 
 TEST(SurfaceTest, SurfaceLifetime) {
-  FrameSinkManager frame_sink_manager;
+  viz::FrameSinkManager frame_sink_manager;
   SurfaceManager* surface_manager = frame_sink_manager.surface_manager();
   auto support = viz::CompositorFrameSinkSupport::Create(
       nullptr, &frame_sink_manager, kArbitraryFrameSinkId, kIsRoot,
@@ -57,7 +57,7 @@
 // Test that CopyOutputRequests can outlive the current frame and be
 // aggregated on the next frame.
 TEST(SurfaceTest, CopyRequestLifetime) {
-  FrameSinkManager frame_sink_manager;
+  viz::FrameSinkManager frame_sink_manager;
   SurfaceManager* surface_manager = frame_sink_manager.surface_manager();
   auto support = viz::CompositorFrameSinkSupport::Create(
       nullptr, &frame_sink_manager, kArbitraryFrameSinkId, kIsRoot,
diff --git a/cc/test/geometry_test_utils.h b/cc/test/geometry_test_utils.h
index 18618d1..0e72e58a 100644
--- a/cc/test/geometry_test_utils.h
+++ b/cc/test/geometry_test_utils.h
@@ -65,6 +65,20 @@
     EXPECT_NEAR((expected).y(), (actual).y(), (abs_error)); \
   } while (false)
 
+#define EXPECT_VECTOR3DF_EQ(expected, actual)      \
+  do {                                             \
+    EXPECT_FLOAT_EQ((expected).x(), (actual).x()); \
+    EXPECT_FLOAT_EQ((expected).y(), (actual).y()); \
+    EXPECT_FLOAT_EQ((expected).z(), (actual).z()); \
+  } while (false)
+
+#define EXPECT_VECTOR3DF_NEAR(expected, actual, abs_error)  \
+  do {                                                      \
+    EXPECT_NEAR((expected).x(), (actual).x(), (abs_error)); \
+    EXPECT_NEAR((expected).y(), (actual).y(), (abs_error)); \
+    EXPECT_NEAR((expected).z(), (actual).z(), (abs_error)); \
+  } while (false)
+
 #define EXPECT_FLOAT_ARRAY_EQ(expected, actual, count) \
   do {                                                 \
     for (int i = 0; i < count; i++) {                  \
diff --git a/cc/test/layer_test_common.h b/cc/test/layer_test_common.h
index 90494d5..87466a0 100644
--- a/cc/test/layer_test_common.h
+++ b/cc/test/layer_test_common.h
@@ -194,9 +194,6 @@
     scoped_refptr<AnimationTimeline> timeline() { return timeline_; }
     scoped_refptr<AnimationTimeline> timeline_impl() { return timeline_impl_; }
 
-    void BuildPropertyTreesForTesting() {
-      host_impl()->active_tree()->BuildPropertyTreesForTesting();
-    }
     void SetElementIdsForTesting() {
       host_impl()->active_tree()->SetElementIdsForTesting();
     }
diff --git a/cc/trees/layer_tree_host_common_unittest.cc b/cc/trees/layer_tree_host_common_unittest.cc
index 80a0c01..d488c7b 100644
--- a/cc/trees/layer_tree_host_common_unittest.cc
+++ b/cc/trees/layer_tree_host_common_unittest.cc
@@ -542,8 +542,13 @@
   scroll_layer->SetScrollable(
       gfx::Size(scroll_layer->bounds().width() + kMaxScrollOffset.x(),
                 scroll_layer->bounds().height() + kMaxScrollOffset.y()));
-
+  SetScrollOffsetDelta(scroll_layer, kScrollDelta);
+  gfx::Transform impl_transform;
   scroll_layer->test_properties()->AddChild(std::move(sublayer_scoped_ptr));
+  scroll_layer_scoped_ptr->layer_tree_impl()
+      ->property_trees()
+      ->scroll_tree.UpdateScrollOffsetBaseForTesting(
+          scroll_layer_scoped_ptr->element_id(), kScrollOffset);
 
   std::unique_ptr<LayerImpl> root(
       LayerImpl::Create(host_impl.active_tree(), 3));
@@ -551,11 +556,6 @@
   root->test_properties()->AddChild(std::move(scroll_layer_scoped_ptr));
   LayerImpl* root_layer = root.get();
   host_impl.active_tree()->SetRootLayerForTesting(std::move(root));
-  host_impl.active_tree()->BuildPropertyTreesForTesting();
-  auto& scroll_tree = host_impl.active_tree()->property_trees()->scroll_tree;
-  scroll_tree.UpdateScrollOffsetBaseForTesting(scroll_layer->element_id(),
-                                               kScrollOffset);
-  SetScrollOffsetDelta(scroll_layer, kScrollDelta);
 
   ExecuteCalculateDrawProperties(root_layer, kDeviceScale, page_scale,
                                  scroll_layer->test_properties()->parent,
@@ -5313,6 +5313,7 @@
   clip_parent->SetMasksToBounds(true);
   intervening->SetScrollable(gfx::Size(1, 1));
   intervening->SetElementId(LayerIdToElementIdForTesting(intervening->id()));
+  intervening->SetCurrentScrollOffset(gfx::ScrollOffset(3, 3));
 
   gfx::Transform translation_transform;
   translation_transform.Translate(2, 2);
@@ -5329,8 +5330,6 @@
   render_surface2->test_properties()->force_render_surface = true;
   clip_child->SetPosition(gfx::PointF(-10.f, -10.f));
   clip_child->SetBounds(gfx::Size(60, 60));
-  BuildPropertyTreesForTesting();
-  intervening->SetCurrentScrollOffset(gfx::ScrollOffset(3, 3));
   ExecuteCalculateDrawProperties(root);
 
   EXPECT_TRUE(GetRenderSurface(root));
@@ -6236,7 +6235,6 @@
   AddAnimatedTransformToElementWithPlayer(animated_layer->element_id(),
                                           timeline_impl(), 1.0,
                                           start_operations, end_operations);
-  BuildPropertyTreesForTesting();
   gfx::Vector2dF scroll_delta(5.f, 9.f);
   SetScrollOffsetDelta(scroller, scroll_delta);
 
@@ -8576,6 +8574,7 @@
   frame_clip->SetDrawsContent(true);
   scroller->SetBounds(gfx::Size(1000, 1000));
   scroller->SetElementId(LayerIdToElementIdForTesting(scroller->id()));
+  scroller->SetCurrentScrollOffset(gfx::ScrollOffset(100, 100));
   scroller->SetElementId(LayerIdToElementIdForTesting(scroller->id()));
   scroller->SetScrollable(frame_clip->bounds());
   scroller->SetDrawsContent(true);
@@ -8585,9 +8584,6 @@
   fixed->SetDrawsContent(true);
   fixed->test_properties()->force_render_surface = true;
 
-  BuildPropertyTreesForTesting();
-  scroller->SetCurrentScrollOffset(gfx::ScrollOffset(100, 100));
-
   LayerPositionConstraint constraint;
   constraint.set_is_fixed_position(true);
   fixed->test_properties()->position_constraint = constraint;
@@ -8657,9 +8653,6 @@
   scroll_child->SetBounds(gfx::Size(40, 40));
   scroll_child->SetDrawsContent(true);
   scroll_parent->SetBounds(gfx::Size(30, 30));
-  scroll_parent->SetScrollable(gfx::Size(50, 50));
-  scroll_parent->SetElementId(
-      LayerIdToElementIdForTesting(scroll_parent->id()));
   scroll_parent->SetDrawsContent(true);
 
   scroll_child->test_properties()->scroll_parent = scroll_parent;
@@ -8671,13 +8664,12 @@
   EXPECT_EQ(gfx::Rect(25, 25), scroll_child->visible_layer_rect());
 
   scroll_child->SetPosition(gfx::PointF(0, -10.f));
+  scroll_parent->SetElementId(
+      LayerIdToElementIdForTesting(scroll_parent->id()));
   scroll_parent->SetCurrentScrollOffset(gfx::ScrollOffset(0.f, 10.f));
-  ExecuteCalculateDrawProperties(root);
-  EXPECT_EQ(gfx::Rect(0, 5, 25, 25), scroll_child->visible_layer_rect());
-
   root->layer_tree_impl()->property_trees()->needs_rebuild = true;
   ExecuteCalculateDrawProperties(root);
-  EXPECT_EQ(gfx::Rect(0, 10, 25, 25), scroll_child->visible_layer_rect());
+  EXPECT_EQ(gfx::Rect(0, 5, 25, 25), scroll_child->visible_layer_rect());
 }
 
 static void CopyOutputCallback(std::unique_ptr<CopyOutputResult> result) {}
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc
index b0f357b..21047c5 100644
--- a/cc/trees/layer_tree_host_impl_unittest.cc
+++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -4766,13 +4766,11 @@
   child->SetDrawsContent(true);
   child->test_properties()->is_container_for_fixed_position_layers = true;
 
-  LayerImpl* child_ptr = child.get();
+  // scroll child to limit
+  SetScrollOffsetDelta(child.get(), gfx::Vector2dF(0, 100.f));
   outer_viewport_scroll_layer->test_properties()->AddChild(std::move(child));
   host_impl_->active_tree()->BuildPropertyTreesForTesting();
 
-  // Scroll child to the limit.
-  SetScrollOffsetDelta(child_ptr, gfx::Vector2dF(0, 100.f));
-
   // Scroll 25px to hide browser controls
   gfx::Vector2dF scroll_delta(0.f, 25.f);
   EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD,
diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc
index 7ff4f3d..2c4aa5b 100644
--- a/cc/trees/layer_tree_impl.cc
+++ b/cc/trees/layer_tree_impl.cc
@@ -156,31 +156,37 @@
   SetScrollbarGeometriesNeedUpdate();
 
   DCHECK(lifecycle().AllowsPropertyTreeAccess());
+  TransformTree& transform_tree = property_trees()->transform_tree;
   ScrollTree& scroll_tree = property_trees()->scroll_tree;
-  const auto* scroll_node = scroll_tree.FindNodeFromElementId(id);
+  int transform_id = TransformTree::kInvalidNodeId;
 
-  // TODO(pdr): There shouldn't be any cases where scroll offset is updated
-  // without a scroll node and we should remove this check entirely.
-  if (!scroll_node) {
+  // If pending tree topology changed and we still want to notify the pending
+  // tree about scroll offset in the active tree, we may not find the
+  // corresponding pending layer.
+  // TODO(pdr): Remove this use of LayerByElementId and instead look up the
+  // scroll node via ElementId and then set transform_id to the scroll node's
+  // transform node index.
+  if (auto* layer = LayerByElementId(id)) {
+    // TODO(sunxd): when we have a layer_id to property_tree index map in
+    // property trees, use the transform_id parameter instead of looking for
+    // indices from LayerImpls.
+    transform_id = layer->transform_tree_index();
+  } else {
     DCHECK(!IsActiveTree());
-
-    // If a scroll node does not yet exist, ensure the property trees are marked
-    // for rebuilding which will update the TransformNode scroll offset.
-    DCHECK(property_trees()->needs_rebuild);
     return;
   }
 
-  DCHECK(scroll_node->transform_id != TransformTree::kInvalidNodeId);
-  TransformTree& transform_tree = property_trees()->transform_tree;
-  auto* transform_node = transform_tree.Node(scroll_node->transform_id);
-  if (transform_node->scroll_offset != scroll_tree.current_scroll_offset(id)) {
-    transform_node->scroll_offset = scroll_tree.current_scroll_offset(id);
-    transform_node->needs_local_transform_update = true;
-    transform_tree.set_needs_update(true);
+  if (transform_id != TransformTree::kInvalidNodeId) {
+    TransformNode* node = transform_tree.Node(transform_id);
+    if (node->scroll_offset != scroll_tree.current_scroll_offset(id)) {
+      node->scroll_offset = scroll_tree.current_scroll_offset(id);
+      node->needs_local_transform_update = true;
+      transform_tree.set_needs_update(true);
+    }
+    node->transform_changed = true;
+    property_trees()->changed = true;
+    set_needs_update_draw_properties();
   }
-  transform_node->transform_changed = true;
-  property_trees()->changed = true;
-  set_needs_update_draw_properties();
 
   if (IsActiveTree()) {
     // Ensure the other trees are kept in sync.
diff --git a/chrome/android/java/res/drawable/content_suggestions_card_corner_bottom.xml b/chrome/android/java/res/drawable/content_suggestions_card_corner_bottom.xml
new file mode 100644
index 0000000..0a008893
--- /dev/null
+++ b/chrome/android/java/res/drawable/content_suggestions_card_corner_bottom.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2017 The Chromium Authors. All rights reserved.
+     Use of this source code is governed by a BSD-style license that can be
+     found in the LICENSE file. -->
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    tools:targetApi="21"
+    android:width="@dimen/content_suggestions_card_modern_corner_radius"
+    android:height="@dimen/content_suggestions_card_modern_corner_radius"
+    android:viewportWidth="10"
+    android:viewportHeight="10">
+    <path
+        android:fillColor="@color/suggestions_modern_bg"
+        android:pathData="M 0,0 A 10,10 0 0 0 10,10 L 0,10 Z" />
+</vector>
diff --git a/chrome/android/java/res/drawable/content_suggestions_card_corner_top.xml b/chrome/android/java/res/drawable/content_suggestions_card_corner_top.xml
new file mode 100644
index 0000000..873617b
--- /dev/null
+++ b/chrome/android/java/res/drawable/content_suggestions_card_corner_top.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2017 The Chromium Authors. All rights reserved.
+     Use of this source code is governed by a BSD-style license that can be
+     found in the LICENSE file. -->
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    tools:targetApi="21"
+    android:width="@dimen/content_suggestions_card_modern_corner_radius"
+    android:height="@dimen/content_suggestions_card_modern_corner_radius"
+    android:viewportWidth="10"
+    android:viewportHeight="10">
+    <path
+        android:fillColor="@color/suggestions_modern_bg"
+        android:pathData="M 0,10 A 10,10 0 0 1 10,0 L 0,0 Z" />
+</vector>
diff --git a/chrome/android/java/res/drawable/content_suggestions_card_modern_background.xml b/chrome/android/java/res/drawable/content_suggestions_card_modern_background.xml
index 80d84f8..402da394 100644
--- a/chrome/android/java/res/drawable/content_suggestions_card_modern_background.xml
+++ b/chrome/android/java/res/drawable/content_suggestions_card_modern_background.xml
@@ -7,5 +7,5 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:shape="rectangle" >
     <solid android:color="@color/default_primary_color" />
-    <corners android:radius="10dp" />
+    <corners android:radius="@dimen/content_suggestions_card_modern_corner_radius" />
 </shape>
diff --git a/chrome/android/java/res/layout/content_suggestions_card_modern.xml b/chrome/android/java/res/layout/content_suggestions_card_modern.xml
index ff33b81..4443f2f2 100644
--- a/chrome/android/java/res/layout/content_suggestions_card_modern.xml
+++ b/chrome/android/java/res/layout/content_suggestions_card_modern.xml
@@ -37,6 +37,28 @@
         android:contentDescription="@null"
         app:srcCompat="@drawable/ic_play_circle_filled" />
 
+    <!-- It would have been nice to use RoundedBitmapDrawable on the thumbnail, but with that you
+         cannot select which corners must be rounded, they are all rounded. -->
+    <ImageView
+        android:id="@+id/corner_top"
+        android:layout_width="@dimen/content_suggestions_card_modern_corner_radius"
+        android:layout_height="@dimen/content_suggestions_card_modern_corner_radius"
+        android:layout_alignParentTop="true"
+        android:layout_alignParentStart="true"
+        android:contentDescription="@null"
+        android:scaleX="@integer/automirror_scale_x"
+        app:srcCompat="@drawable/content_suggestions_card_corner_top" />
+
+    <ImageView
+        android:id="@+id/corner_bottom"
+        android:layout_width="@dimen/content_suggestions_card_modern_corner_radius"
+        android:layout_height="@dimen/content_suggestions_card_modern_corner_radius"
+        android:layout_alignParentBottom="true"
+        android:layout_alignParentStart="true"
+        android:contentDescription="@null"
+        android:scaleX="@integer/automirror_scale_x"
+        app:srcCompat="@drawable/content_suggestions_card_corner_bottom" />
+
     <LinearLayout
         android:id="@+id/text_layout"
         android:layout_alignParentEnd="true"
diff --git a/chrome/android/java/res/values-ldrtl/values.xml b/chrome/android/java/res/values-ldrtl/values.xml
index 9a5ffad..5f53b06a 100644
--- a/chrome/android/java/res/values-ldrtl/values.xml
+++ b/chrome/android/java/res/values-ldrtl/values.xml
@@ -6,4 +6,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android">
     <!-- Menu Animation Constants -->
     <item type="fraction" format="fraction" name="menu_animation_pivot_x">5%</item>
+
+    <!-- Value for scaleX to mirror drawables correctly for LTR / RTL layouts. -->
+    <integer name="automirror_scale_x">-1</integer>
 </resources>
\ No newline at end of file
diff --git a/chrome/android/java/res/values/colors.xml b/chrome/android/java/res/values/colors.xml
index c0c9df4..4acbc943 100644
--- a/chrome/android/java/res/values/colors.xml
+++ b/chrome/android/java/res/values/colors.xml
@@ -129,6 +129,7 @@
     <color name="snippets_text_color">#646464</color>
     <color name="snippets_list_header_text_color">#646464</color>
     <color name="snippets_headline_text_color">#333333</color>
+    <color name="suggestions_modern_bg">@android:color/white</color>
 
     <!-- Incognito NTP Colors. -->
     <color name="incognito_text">#b3ffffff</color>
diff --git a/chrome/android/java/res/values/dimens.xml b/chrome/android/java/res/values/dimens.xml
index 8807754..801639c 100644
--- a/chrome/android/java/res/values/dimens.xml
+++ b/chrome/android/java/res/values/dimens.xml
@@ -337,6 +337,7 @@
     <dimen name="chrome_home_suggestions_footer_padding_top">24dp</dimen>
     <dimen name="chrome_home_suggestions_footer_padding_bottom">24dp</dimen>
     <dimen name="content_suggestions_card_modern_margin">16dp</dimen>
+    <dimen name="content_suggestions_card_modern_corner_radius">10dp</dimen>
 
     <!-- Recent tabs page -->
     <dimen name="recent_tabs_visible_separator_padding">8dp</dimen>
diff --git a/chrome/android/java/res/values/values.xml b/chrome/android/java/res/values/values.xml
index 8ea6bc2..19956f1 100644
--- a/chrome/android/java/res/values/values.xml
+++ b/chrome/android/java/res/values/values.xml
@@ -67,4 +67,7 @@
          loaded. -->
     <bool name="is_tablet">false</bool>
     <bool name="is_large_tablet">false</bool>
+
+    <!-- Value for scaleX to mirror drawables correctly for LTR / RTL layouts. -->
+    <integer name="automirror_scale_x">1</integer>
 </resources>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/OWNERS b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/OWNERS
new file mode 100644
index 0000000..3feaf49
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/OWNERS
@@ -0,0 +1,3 @@
+twellington@chromium.org
+
+# COMPONENT: UI>Browser>Mobile
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadBroadcastReceiver.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadBroadcastReceiver.java
index 4f4f9a9..b0b894a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadBroadcastReceiver.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadBroadcastReceiver.java
@@ -71,9 +71,13 @@
                 intent, DownloadNotificationService.EXTRA_IS_SUPPORTED_MIME_TYPE, false);
         boolean isOffTheRecord = IntentUtils.safeGetBooleanExtra(
                 intent, DownloadNotificationService.EXTRA_IS_OFF_THE_RECORD, false);
+        String originalUrl = IntentUtils.safeGetStringExtra(
+                intent, Intent.EXTRA_ORIGINATING_URI);
+        String referrer = IntentUtils.safeGetStringExtra(intent, Intent.EXTRA_REFERRER);
         ContentId contentId = DownloadNotificationService.getContentIdFromIntent(intent);
         DownloadManagerService.openDownloadedContent(
-                context, downloadFilename, isSupportedMimeType, isOffTheRecord, contentId.id, id);
+                context, downloadFilename, isSupportedMimeType, isOffTheRecord, contentId.id, id,
+                originalUrl, referrer);
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java
index 1bd492d..e958a60 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java
@@ -731,12 +731,15 @@
      * @param filePath   Path to the file.
      * @param downloadId ID of the download item in DownloadManager.
      * @param isSupportedMimeType Whether the MIME type is supported by browser.
+     * @param downloadId ID of the download item in DownloadManager.
+     * @param originalUrl The original url of the downloaded file
+     * @param referrer   Referrer of the downloaded file.
      * @return the intent to launch for the given download item.
      */
     @Nullable
     static Intent getLaunchIntentFromDownloadId(
             Context context, @Nullable String filePath, long downloadId,
-            boolean isSupportedMimeType) {
+            boolean isSupportedMimeType, String originalUrl, String referrer) {
         assert !ThreadUtils.runningOnUiThread();
         Uri contentUri = filePath == null
                 ? DownloadManagerDelegate.getContentUriFromDownloadManager(context, downloadId)
@@ -753,7 +756,8 @@
             if (filePath != null) fileUri = Uri.fromFile(new File(filePath));
             return DownloadUtils.getMediaViewerIntentForDownloadItem(fileUri, contentUri, mimeType);
         }
-        return DownloadUtils.createViewIntentForDownloadItem(contentUri, mimeType);
+        return DownloadUtils.createViewIntentForDownloadItem(
+                contentUri, mimeType, originalUrl, referrer);
     }
 
     /**
@@ -769,7 +773,7 @@
         assert !ThreadUtils.runningOnUiThread();
         Intent intent = getLaunchIntentFromDownloadId(
                 context, download.getDownloadInfo().getFilePath(),
-                download.getSystemDownloadId(), isSupportedMimeType);
+                download.getSystemDownloadId(), isSupportedMimeType, null, null);
         return (intent == null)
                 ? false : ExternalNavigationDelegateImpl.resolveIntent(intent, true);
     }
@@ -778,7 +782,8 @@
     protected void openDownloadedContent(final DownloadInfo downloadInfo, final long downloadId) {
         openDownloadedContent(mContext, downloadInfo.getFilePath(),
                 isSupportedMimeType(downloadInfo.getMimeType()), downloadInfo.isOffTheRecord(),
-                downloadInfo.getDownloadGuid(), downloadId);
+                downloadInfo.getDownloadGuid(), downloadId, downloadInfo.getOriginalUrl(),
+                downloadInfo.getReferrer());
     }
 
     /**
@@ -791,15 +796,18 @@
      * @param isOffTheRecord      Whether the download was for a off the record profile.
      * @param downloadGuid        GUID of the download item in DownloadManager.
      * @param downloadId          ID of the download item in DownloadManager.
+     * @param originalUrl         The original url of the downloaded file.
+     * @param referrer            Referrer of the downloaded file.
      */
     protected static void openDownloadedContent(final Context context, final String filePath,
             final boolean isSupportedMimeType, final boolean isOffTheRecord,
-            final String downloadGuid, final long downloadId) {
+            final String downloadGuid, final long downloadId, final String originalUrl,
+            final String referrer) {
         new AsyncTask<Void, Void, Intent>() {
             @Override
             public Intent doInBackground(Void... params) {
                 return getLaunchIntentFromDownloadId(
-                        context, filePath, downloadId, isSupportedMimeType);
+                        context, filePath, downloadId, isSupportedMimeType, originalUrl, referrer);
             }
 
             @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java
index a7b700e..e54ed5e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java
@@ -972,13 +972,15 @@
      * @param isSupportedMimeType Whether the MIME type can be viewed inside browser.
      * @param isOpenable          Whether or not this download can be opened.
      * @param icon                A {@link Bitmap} to be used as the large icon for display.
+     * @param originalUrl         The original url of the downloaded file.
+     * @param referrer            Referrer of the downloaded file.
      * @return                    ID of the successful download notification. Used for removing the
      *                            notification when user click on the snackbar.
      */
     @VisibleForTesting
     public int notifyDownloadSuccessful(ContentId id, String filePath, String fileName,
             long systemDownloadId, boolean isOffTheRecord, boolean isSupportedMimeType,
-            boolean isOpenable, Bitmap icon) {
+            boolean isOpenable, Bitmap icon, String originalUrl, String referrer) {
         int notificationId = getNotificationId(id);
         ChromeNotificationBuilder builder = buildNotification(R.drawable.offline_pin, fileName,
                 mContext.getResources().getString(R.string.download_notification_completed));
@@ -997,6 +999,7 @@
                 intent.putExtra(EXTRA_DOWNLOAD_CONTENTID_ID, id.id);
                 intent.putExtra(EXTRA_DOWNLOAD_CONTENTID_NAMESPACE, id.namespace);
                 intent.putExtra(NotificationConstants.EXTRA_NOTIFICATION_ID, notificationId);
+                DownloadUtils.setOriginalUrlAndReferralExtraToIntent(intent, originalUrl, referrer);
             } else {
                 intent = buildActionIntent(mContext, ACTION_DOWNLOAD_OPEN, id, false);
             }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadUtils.java
index bb3ca8b..9d2a068 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadUtils.java
@@ -14,6 +14,7 @@
 import android.graphics.BitmapFactory;
 import android.graphics.Color;
 import android.net.Uri;
+import android.os.Build;
 import android.os.StrictMode;
 import android.provider.Browser;
 import android.support.annotation.IntDef;
@@ -285,9 +286,12 @@
      * Creates an Intent to open the file in another app by firing an Intent to Android.
      * @param fileUri  Uri pointing to the file.
      * @param mimeType MIME type for the file.
+     * @param originalUrl The original url of the downloaded file.
+     * @param referrer Referrer of the downloaded file.
      * @return Intent that can be used to start an Activity for the file.
      */
-    public static Intent createViewIntentForDownloadItem(Uri fileUri, String mimeType) {
+    public static Intent createViewIntentForDownloadItem(Uri fileUri, String mimeType,
+            String originalUrl, String referrer) {
         Intent fileIntent = new Intent(Intent.ACTION_VIEW);
         String normalizedMimeType = Intent.normalizeMimeType(mimeType);
         if (TextUtils.isEmpty(normalizedMimeType)) {
@@ -297,10 +301,24 @@
         }
         fileIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
         fileIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        setOriginalUrlAndReferralExtraToIntent(fileIntent, originalUrl, referrer);
         return fileIntent;
     }
 
     /**
+     * Adds the originating Uri and referrer extras to an intent if they are not null.
+     * @param intent      Intent for adding extras.
+     * @param originalUrl The original url of the downloaded file.
+     * @param referrer    Referrer of the downloaded file.
+     */
+    public static void setOriginalUrlAndReferralExtraToIntent(
+            Intent intent, String originalUrl, String referrer) {
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) return;
+        if (originalUrl != null) intent.putExtra(Intent.EXTRA_ORIGINATING_URI, originalUrl);
+        if (referrer != null) intent.putExtra(Intent.EXTRA_REFERRER, referrer);
+    }
+
+    /**
      * Creates an Intent to share {@code items} with another app by firing an Intent to Android.
      *
      * Sharing a DownloadItem shares the file itself, while sharing an OfflinePageItem shares the
@@ -427,7 +445,7 @@
     public static Intent getMediaViewerIntentForDownloadItem(
             Uri fileUri, Uri contentUri, String mimeType) {
         Context context = ContextUtils.getApplicationContext();
-        Intent viewIntent = createViewIntentForDownloadItem(contentUri, mimeType);
+        Intent viewIntent = createViewIntentForDownloadItem(contentUri, mimeType, null, null);
 
         Bitmap closeIcon = BitmapFactory.decodeResource(
                 context.getResources(), R.drawable.ic_arrow_back_white_24dp);
@@ -510,10 +528,13 @@
      * @param mimeType mime type of the file.
      * @param downloadGuid The associated download GUID.
      * @param isOffTheRecord whether we are in an off the record context.
+     * @param originalUrl The original url of the downloaded file.
+     * @param referrer Referrer of the downloaded file.
      * @return whether the file could successfully be opened.
      */
     public static boolean openFile(
-            File file, String mimeType, String downloadGuid, boolean isOffTheRecord) {
+            File file, String mimeType, String downloadGuid, boolean isOffTheRecord,
+            String originalUrl, String referrer) {
         Context context = ContextUtils.getApplicationContext();
         DownloadManagerService service = DownloadManagerService.getDownloadManagerService();
 
@@ -538,7 +559,8 @@
             StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads();
             Uri uri = ApiCompatibilityUtils.getUriForDownloadedFile(file);
             StrictMode.setThreadPolicy(oldPolicy);
-            Intent viewIntent = createViewIntentForDownloadItem(uri, mimeType);
+            Intent viewIntent = createViewIntentForDownloadItem(
+                    uri, mimeType, originalUrl, referrer);
             context.startActivity(viewIntent);
             service.updateLastAccessTime(downloadGuid, isOffTheRecord);
             return true;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/SystemDownloadNotifier.java b/chrome/android/java/src/org/chromium/chrome/browser/download/SystemDownloadNotifier.java
index 74f22db6..88d6dff22 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/SystemDownloadNotifier.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/SystemDownloadNotifier.java
@@ -287,7 +287,8 @@
                 final int notificationId = mBoundService.notifyDownloadSuccessful(
                         info.getContentId(), info.getFilePath(), info.getFileName(),
                         notificationInfo.systemDownloadId, info.isOffTheRecord(),
-                        notificationInfo.isSupportedMimeType, info.getIsOpenable(), info.getIcon());
+                        notificationInfo.isSupportedMimeType, info.getIsOpenable(), info.getIcon(),
+                        info.getOriginalUrl(), info.getReferrer());
                 onSuccessNotificationShown(notificationInfo, notificationId);
                 break;
             case DOWNLOAD_NOTIFICATION_TYPE_FAILURE:
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadHistoryItemWrapper.java b/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadHistoryItemWrapper.java
index e9ce6fa..9dc36fc 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadHistoryItemWrapper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadHistoryItemWrapper.java
@@ -324,9 +324,10 @@
                         Toast.LENGTH_SHORT).show();
                 return;
             }
-
             if (DownloadUtils.openFile(getFile(), getMimeType(),
-                        mItem.getDownloadInfo().getDownloadGuid(), isOffTheRecord())) {
+                        mItem.getDownloadInfo().getDownloadGuid(), isOffTheRecord(),
+                        mItem.getDownloadInfo().getOriginalUrl(),
+                        mItem.getDownloadInfo().getReferrer())) {
                 recordOpenSuccess();
             } else {
                 recordOpenFailure();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/DuplicateDownloadInfoBar.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/DuplicateDownloadInfoBar.java
index 8072b03..2c8221a7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/DuplicateDownloadInfoBar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/DuplicateDownloadInfoBar.java
@@ -87,7 +87,7 @@
                     @Override
                     protected void onPostExecute(Boolean fileExists) {
                         if (fileExists) {
-                            DownloadUtils.openFile(file, mimeType, null, mIsIncognito);
+                            DownloadUtils.openFile(file, mimeType, null, mIsIncognito, null, null);
                         } else {
                             DownloadManagerService.openDownloadsPage(
                                     ContextUtils.getApplicationContext());
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivityLocationBarLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivityLocationBarLayout.java
index 995ffa48..3970570 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivityLocationBarLayout.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivityLocationBarLayout.java
@@ -31,12 +31,13 @@
     }
 
     private Delegate mDelegate;
-    private boolean mShowSuggestions;
+    private boolean mPendingSearchPromoDecision;
+    private boolean mPendingBeginQuery;
 
     public SearchActivityLocationBarLayout(Context context, AttributeSet attrs) {
         super(context, attrs, R.layout.location_bar_base);
         setUrlBarFocusable(true);
-        mShowSuggestions = !LocaleManager.getInstance().needToCheckForSearchEnginePromo();
+        mPendingSearchPromoDecision = LocaleManager.getInstance().needToCheckForSearchEnginePromo();
     }
 
     /** Set the {@link Delegate}. */
@@ -69,14 +70,15 @@
     public void onNativeLibraryReady() {
         super.onNativeLibraryReady();
         setAutocompleteProfile(Profile.getLastUsedProfile().getOriginalProfile());
+
+        mPendingSearchPromoDecision = LocaleManager.getInstance().needToCheckForSearchEnginePromo();
         setShowCachedZeroSuggestResults(true);
-        mShowSuggestions = !LocaleManager.getInstance().needToCheckForSearchEnginePromo();
     }
 
     @Override
     public void onSuggestionsReceived(
             List<OmniboxSuggestion> newSuggestions, String inlineAutocompleteText) {
-        if (!mShowSuggestions) return;
+        if (mPendingSearchPromoDecision) return;
         super.onSuggestionsReceived(newSuggestions, inlineAutocompleteText);
     }
 
@@ -85,11 +87,39 @@
         SearchWidgetProvider.updateCachedVoiceSearchAvailability(isVoiceSearchEnabled());
         if (isVoiceSearchIntent && mUrlBar.isFocused()) onUrlFocusChange(true);
         if (!TextUtils.isEmpty(mUrlBar.getText())) onTextChangedForAutocomplete();
-        mShowSuggestions = true;
+
+        assert !LocaleManager.getInstance().needToCheckForSearchEnginePromo();
+        mPendingSearchPromoDecision = false;
+
+        if (mPendingBeginQuery) {
+            beginQueryInternal(isVoiceSearchIntent);
+            mPendingBeginQuery = false;
+        }
     }
 
     /** Begins a new query. */
     void beginQuery(boolean isVoiceSearchIntent) {
+        // Clear the text regardless of the promo decision.  This allows the user to enter text
+        // before native has been initialized and have it not be cleared one the delayed beginQuery
+        // logic is performed.
+        mUrlBar.setIgnoreTextChangesForAutocomplete(true);
+        mUrlBar.setUrl("", null);
+        mUrlBar.setIgnoreTextChangesForAutocomplete(false);
+
+        mUrlBar.setCursorVisible(true);
+        mUrlBar.setSelection(0, mUrlBar.getText().length());
+
+        if (mPendingSearchPromoDecision) {
+            mPendingBeginQuery = true;
+            return;
+        }
+
+        beginQueryInternal(isVoiceSearchIntent);
+    }
+
+    private void beginQueryInternal(boolean isVoiceSearchIntent) {
+        assert !mPendingSearchPromoDecision;
+
         if (isVoiceSearchEnabled() && isVoiceSearchIntent) {
             startVoiceRecognition();
         } else {
@@ -105,14 +135,8 @@
     }
 
     private void focusTextBox() {
-        if (mNativeInitialized) onUrlFocusChange(true);
+        if (!mUrlBar.hasFocus()) mUrlBar.requestFocus();
 
-        mUrlBar.setIgnoreTextChangesForAutocomplete(true);
-        mUrlBar.setUrl("", null);
-        mUrlBar.setIgnoreTextChangesForAutocomplete(false);
-
-        mUrlBar.setCursorVisible(true);
-        mUrlBar.setSelection(0, mUrlBar.getText().length());
         new Handler().post(new Runnable() {
             @Override
             public void run() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsConfig.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsConfig.java
index ef49f0c4..d9325bd1 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsConfig.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsConfig.java
@@ -5,7 +5,6 @@
 package org.chromium.chrome.browser.suggestions;
 
 import android.content.res.Resources;
-import android.graphics.Color;
 
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.chrome.R;
@@ -29,7 +28,8 @@
      * @return The background color for the suggestions sheet content.
      */
     public static int getBackgroundColor(Resources resources) {
-        return useModern() ? Color.WHITE
-                           : ApiCompatibilityUtils.getColor(resources, R.color.ntp_bg);
+        return useModern()
+                ? ApiCompatibilityUtils.getColor(resources, R.color.suggestions_modern_bg)
+                : ApiCompatibilityUtils.getColor(resources, R.color.ntp_bg);
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsNavigationDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsNavigationDelegateImpl.java
index 100cb87..9f34112 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsNavigationDelegateImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsNavigationDelegateImpl.java
@@ -103,7 +103,8 @@
                     || windowOpenDisposition == WindowOpenDisposition.NEW_WINDOW
                     || windowOpenDisposition == WindowOpenDisposition.NEW_BACKGROUND_TAB;
             DownloadUtils.openFile(article.getAssetDownloadFile(),
-                    article.getAssetDownloadMimeType(), article.getAssetDownloadGuid(), false);
+                    article.getAssetDownloadMimeType(), article.getAssetDownloadGuid(), false, null,
+                    null);
             return;
         }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/BottomToolbarPhone.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/BottomToolbarPhone.java
index 4e03adf..7aef3da4 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/BottomToolbarPhone.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/BottomToolbarPhone.java
@@ -50,12 +50,21 @@
         @Override
         public void onSheetOpened() {
             onPrimaryColorChanged(true);
+            if (mUseToolbarHandle) {
+                // If the toolbar is focused, switch focus to the bottom sheet before changing the
+                // content description. If the content description is changed while the view is
+                // focused, the new content description is read immediately.
+                if (hasFocus() && !urlHasFocus()) mBottomSheet.requestFocus();
+                updateContentDescription();
+            }
         }
 
         @Override
         public void onSheetClosed() {
             onPrimaryColorChanged(true);
+
             updateMenuButtonClickableState();
+            updateContentDescription();
         }
 
         @Override
@@ -244,6 +253,13 @@
             boolean delayAnimation, boolean animate) {
         super.setTabSwitcherMode(inTabSwitcherMode, showToolbar, delayAnimation, animate);
         if (!mUseToolbarHandle) mExpandButton.setClickable(!inTabSwitcherMode);
+        updateContentDescription();
+    }
+
+    @Override
+    protected void onTabSwitcherTransitionFinished() {
+        super.onTabSwitcherTransitionFinished();
+        updateContentDescription();
     }
 
     @Override
@@ -476,8 +492,7 @@
         if (!mUseToolbarHandle) {
             initExpandButton();
         } else {
-            setContentDescription(
-                    getResources().getString(R.string.bottom_sheet_accessibility_toolbar));
+            updateContentDescription();
         }
     }
 
@@ -863,4 +878,18 @@
         mMenuButton.setClickable(
                 !urlHasFocus() && (!mBottomSheet.isSheetOpen() || mBottomSheet.isShowingNewTab()));
     }
+
+    private void updateContentDescription() {
+        if (!mUseToolbarHandle) return;
+
+        if (isInTabSwitcherMode()) {
+            setContentDescription(null);
+        } else if (mBottomSheet.isSheetOpen()) {
+            setContentDescription(
+                    getResources().getString(R.string.bottom_sheet_open_accessibility_toolbar));
+        } else {
+            setContentDescription(
+                    getResources().getString(R.string.bottom_sheet_accessibility_toolbar));
+        }
+    }
 }
diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd
index d16ffa6d..a845bb6 100644
--- a/chrome/android/java/strings/android_chrome_strings.grd
+++ b/chrome/android/java/strings/android_chrome_strings.grd
@@ -3083,6 +3083,9 @@
       <message name="IDS_BOTTOM_SHEET_ACCESSIBILITY_TOOLBAR" desc="Accessibilty string read when the bottom toolbar, containing the adddress bar and some buttons, is focused. Informs users that they can pull up on the address bar to see their bookmarks and other content.">
         Address bar. Pull up to see bookmarks, downloads, and history.
       </message>
+      <message name="IDS_BOTTOM_SHEET_OPEN_ACCESSIBILITY_TOOLBAR" desc="Accessibilty string read when the bottom toolbar, containing the adddress bar and some buttons, is focused and the Chrome Home navigation panel is open. Informs users that they can pull down on the address bar to close the navigation panel.">
+        Address bar. Pull down to close navigation panel.
+      </message>
       <message name="IDS_BOTTOM_SHEET_EXPAND_BUTTON_HELP_BUBBLE_MESSAGE" desc="Text displayed in a help bubble above the toolbar expand button prompting users to tap the button to see their bookmarks and other content.">
         Tap to see bookmarks and more
       </message>
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/OWNERS b/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/OWNERS
new file mode 100644
index 0000000..de0c9ec
--- /dev/null
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/OWNERS
@@ -0,0 +1 @@
+file://chrome/android/java/src/org/chromium/chrome/browser/appmenu/OWNERS
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadNotificationServiceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadNotificationServiceTest.java
index 5ed67d7c..0e7e524 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadNotificationServiceTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadNotificationServiceTest.java
@@ -308,7 +308,7 @@
 
         ContentId id1 = LegacyHelpers.buildLegacyContentId(false, guid1);
         service.notifyDownloadSuccessful(
-                id1, "/path/to/success", "success", 100L, false, false, true, null);
+                id1, "/path/to/success", "success", 100L, false, false, true, null, null, null);
         entries = DownloadManagerService.getStoredDownloadInfo(
                 sharedPrefs, DownloadSharedPreferenceHelper.KEY_PENDING_DOWNLOAD_NOTIFICATIONS);
         assertEquals(2, entries.size());
@@ -325,7 +325,7 @@
 
         ContentId id4 = LegacyHelpers.buildLegacyContentId(false, UUID.randomUUID().toString());
         service.notifyDownloadSuccessful(
-                id4, "/path/to/success", "success", 100L, false, false, true, null);
+                id4, "/path/to/success", "success", 100L, false, false, true, null, null, null);
         assertEquals(3, getService().getNotificationIds().size());
         int nextNotificationId = getService().getLastAddedNotificationId();
         service.cancelNotification(nextNotificationId, id4);
@@ -345,7 +345,7 @@
         DownloadNotificationService service = bindNotificationService();
         ContentId id = LegacyHelpers.buildLegacyContentId(false, UUID.randomUUID().toString());
         service.notifyDownloadSuccessful(
-                id, "/path/to/test", "test", 100L, false, false, true, null);
+                id, "/path/to/test", "test", 100L, false, false, true, null, null, null);
         assertEquals(1, getService().getNotificationIds().size());
     }
 
@@ -445,7 +445,7 @@
                 10L, 1000L, 10L, false, false, false, null);
         assertFalse(service.hideSummaryNotificationIfNecessary(-1));
         service.notifyDownloadSuccessful(
-                id, "/path/to/test", "test", 100L, false, false, true, null);
+                id, "/path/to/test", "test", 100L, false, false, true, null, null, null);
         assertTrue(service.hideSummaryNotificationIfNecessary(-1));
     }
 
@@ -545,10 +545,10 @@
         service.notifyDownloadPaused(id1, "/path/to/test", true, false, false, false, null);
         assertFalse(service.hideSummaryNotificationIfNecessary(-1));
         service.notifyDownloadSuccessful(
-                id1, "/path/to/test", "test", 100L, false, false, true, null);
+                id1, "/path/to/test", "test", 100L, false, false, true, null, null, null);
         assertFalse(service.hideSummaryNotificationIfNecessary(-1));
         service.notifyDownloadSuccessful(
-                id2, "/path/to/test", "test", 100L, false, false, true, null);
+                id2, "/path/to/test", "test", 100L, false, false, true, null, null, null);
         assertTrue(service.hideSummaryNotificationIfNecessary(-1));
     }
 }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/download/MockDownloadNotificationService.java b/chrome/android/javatests/src/org/chromium/chrome/browser/download/MockDownloadNotificationService.java
index 1e7f393..ea483c9 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/download/MockDownloadNotificationService.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/download/MockDownloadNotificationService.java
@@ -98,13 +98,14 @@
     @Override
     public int notifyDownloadSuccessful(final ContentId id, final String filePath,
             final String fileName, final long systemDownloadId, final boolean isOffTheRecord,
-            final boolean isSupportedMimeType, final boolean isOpenable, final Bitmap icon) {
+            final boolean isSupportedMimeType, final boolean isOpenable, final Bitmap icon,
+            final String originalUrl, final String referrer) {
         return ThreadUtils.runOnUiThreadBlockingNoException(new Callable<Integer>() {
             @Override
             public Integer call() throws Exception {
                 return MockDownloadNotificationService.super.notifyDownloadSuccessful(id, filePath,
                         fileName, systemDownloadId, isOffTheRecord, isSupportedMimeType, isOpenable,
-                        icon);
+                        icon, originalUrl, referrer);
             }
         });
     }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/searchwidget/SearchActivityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/searchwidget/SearchActivityTest.java
index 4b15554b..38e7651 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/searchwidget/SearchActivityTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/searchwidget/SearchActivityTest.java
@@ -98,10 +98,15 @@
                     }
                 });
                 super.showSearchEngineDialogIfNeeded(activity, onSearchEngineFinalized);
-                return;
+            } else {
+                LocaleManager.setInstanceForTest(new LocaleManager() {
+                    @Override
+                    public boolean needToCheckForSearchEnginePromo() {
+                        return false;
+                    }
+                });
+                if (!shouldDelayDeferredInitialization) onSearchEngineFinalized.onResult(true);
             }
-
-            if (!shouldDelayDeferredInitialization) onSearchEngineFinalized.onResult(true);
         }
 
         @Override
@@ -132,6 +137,7 @@
     @After
     public void tearDown() {
         SearchActivity.setDelegateForTests(null);
+        LocaleManager.setInstanceForTest(null);
     }
 
     @Test
@@ -454,6 +460,7 @@
             @Override
             public void run() {
                 UrlBar urlBar = (UrlBar) activity.findViewById(R.id.url_bar);
+                if (!urlBar.hasFocus()) urlBar.requestFocus();
                 urlBar.setText(url);
             }
         });
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/WebVrTransitionTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/WebVrTransitionTest.java
index d556b2d..15eaea0 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/WebVrTransitionTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/WebVrTransitionTest.java
@@ -5,6 +5,7 @@
 package org.chromium.chrome.browser.vr_shell;
 
 import static org.chromium.chrome.browser.vr_shell.VrTestRule.PAGE_LOAD_TIMEOUT_S;
+import static org.chromium.chrome.test.util.ChromeRestriction.RESTRICTION_TYPE_DON_ENABLED;
 import static org.chromium.chrome.test.util.ChromeRestriction.RESTRICTION_TYPE_VIEWER_DAYDREAM;
 
 import android.os.Build;
@@ -67,4 +68,20 @@
         mVrTestRule.waitOnJavaScriptStep(mVrTestRule.getFirstTabWebContents());
         mVrTestRule.endTest(mVrTestRule.getFirstTabWebContents());
     }
+
+    /**
+     * Tests that the requestPresent promise doesn't resolve if the DON flow is
+     * not completed.
+     */
+    @Test
+    @MediumTest
+    @Restriction({RESTRICTION_TYPE_VIEWER_DAYDREAM, RESTRICTION_TYPE_DON_ENABLED})
+    public void testPresentationPromiseUnresolvedDuringDon() throws InterruptedException {
+        mVrTestRule.loadUrlAndAwaitInitialization(
+                VrTestRule.getHtmlTestFile("test_presentation_promise_unresolved_during_don"),
+                PAGE_LOAD_TIMEOUT_S);
+        VrTransitionUtils.enterPresentationAndWait(
+                mVrTestRule.getFirstTabCvc(), mVrTestRule.getFirstTabWebContents());
+        mVrTestRule.endTest(mVrTestRule.getFirstTabWebContents());
+    }
 }
diff --git a/chrome/android/shared_preference_files/test/vr_ddview_don_setupcomplete.json b/chrome/android/shared_preference_files/test/vr_ddview_don_setupcomplete.json
new file mode 100644
index 0000000..9e1e2b4
--- /dev/null
+++ b/chrome/android/shared_preference_files/test/vr_ddview_don_setupcomplete.json
@@ -0,0 +1,14 @@
+[
+  {
+    "package": "com.google.vr.vrcore",
+    "filename": "VrCoreSettings.xml",
+    "set": {
+      "VrSkipDon": false,
+      "DaydreamSetupComplete": true,
+      "VrDeviceParams": "CgxHb29nbGUsIEluYy4SDURheWRyZWFtIFZpZXcdCfkgPSUB3oI9KhAAAFxCAABcQgAAXEIAAFxCNd9PDT06CLgexT7Zzhc_WABgAJqRYBoIARIKDQAAAAAV9P3UPBIKDQAAAAAV9P3UvA",
+      "UseAutomatedController": false,
+      "PairedControllerDriver": "DRIVER_P6",
+      "PairedControllerAddress": "AA:AA:AA:AA:AA:AA"
+    }
+  }
+]
diff --git a/chrome/app/android/DEPS b/chrome/app/android/DEPS
index 0e145c3..6a58d29 100644
--- a/chrome/app/android/DEPS
+++ b/chrome/app/android/DEPS
@@ -3,4 +3,8 @@
   "chrome_main_delegate_android.cc": [
     "+content/browser/media/android/browser_media_player_manager.h",
   ],
+  "chrome_jni_onload.cc": [
+    "+device/vr/features/features.h",
+    "+third_party/gvr-android-sdk"
+  ],
 }
\ No newline at end of file
diff --git a/chrome/app/android/chrome_jni_onload.cc b/chrome/app/android/chrome_jni_onload.cc
index 64310dc..8d3cfe3 100644
--- a/chrome/app/android/chrome_jni_onload.cc
+++ b/chrome/app/android/chrome_jni_onload.cc
@@ -5,21 +5,42 @@
 #include "chrome/app/android/chrome_jni_onload.h"
 
 #include "base/android/jni_android.h"
-#include "base/android/library_loader/library_loader_hooks.h"
+#include "base/android/jni_registrar.h"
+#include "base/android/jni_utils.h"
 #include "chrome/app/android/chrome_android_initializer.h"
-#include "chrome/browser/android/chrome_jni_registrar.h"
 #include "content/public/app/content_jni_onload.h"
+#include "device/vr/features/features.h"
+
+#if BUILDFLAG(ENABLE_VR)
+#include "third_party/gvr-android-sdk/display_synchronizer_jni.h"
+#include "third_party/gvr-android-sdk/gvr_api_jni.h"
+#include "third_party/gvr-android-sdk/native_callbacks_jni.h"
+#endif
 
 namespace android {
 
+// These VR native functions are not handled by the automatic registration, so
+// they are manually registered here.
+#if BUILDFLAG(ENABLE_VR)
+static base::android::RegistrationMethod kChromeRegisteredMethods[] = {
+    {"DisplaySynchronizer",
+     DisplaySynchronizer::RegisterDisplaySynchronizerNatives},
+    {"GvrApi", GvrApi::RegisterGvrApiNatives},
+    {"NativeCallbacks", NativeCallbacks::RegisterNativeCallbacksNatives},
+};
+#endif
+
 bool OnJNIOnLoadRegisterJNI(JNIEnv* env) {
   if (!content::android::OnJNIOnLoadRegisterJNI(env))
     return false;
 
-  if (base::android::GetLibraryProcessType(env) ==
-      base::android::PROCESS_BROWSER) {
-    return RegisterBrowserJNI(env);
+#if BUILDFLAG(ENABLE_VR)
+  // Register manually when on the browser process.
+  if (!base::android::IsSelectiveJniRegistrationEnabled(env)) {
+    return RegisterNativeMethods(env, kChromeRegisteredMethods,
+                                 arraysize(kChromeRegisteredMethods));
   }
+#endif
   return true;
 }
 
diff --git a/chrome/app/chrome_main.cc b/chrome/app/chrome_main.cc
index d1c673a2..5c6bb8e 100644
--- a/chrome/app/chrome_main.cc
+++ b/chrome/app/chrome_main.cc
@@ -122,8 +122,6 @@
   if (command_line->GetSwitchValueASCII(switches::kProcessType) ==
       switches::kProfiling)
     return profiling::ProfilingMain(*command_line);
-  if (command_line->HasSwitch(switches::kProcessType))
-    profiling::InitMemlogSenderIfNecessary(*command_line);
 #endif  // ENABLE_OOP_HEAP_PROFILING
 
 #if defined(OS_CHROMEOS) && BUILDFLAG(ENABLE_PACKAGE_MASH_SERVICES)
diff --git a/chrome/app/chrome_watcher_command_line_win.cc b/chrome/app/chrome_watcher_command_line_win.cc
index bf87b6a..c6edb61f 100644
--- a/chrome/app/chrome_watcher_command_line_win.cc
+++ b/chrome/app/chrome_watcher_command_line_win.cc
@@ -8,6 +8,7 @@
 
 #include <string>
 
+#include "base/base_switches.h"
 #include "base/command_line.h"
 #include "base/files/file_path.h"
 #include "base/logging.h"
@@ -154,9 +155,15 @@
                      &command_line);
   AppendHandleSwitch(kParentHandleSwitch, parent_process, &command_line);
 
-#if defined(OS_WIN)
   command_line.AppendArg(switches::kPrefetchArgumentWatcher);
-#endif  // defined(OS_WIN)
+
+  // Copy over logging switches.
+  static const char* const kSwitchNames[] = {switches::kEnableLogging,
+                                             switches::kV, switches::kVModule};
+  base::CommandLine current_command_line =
+      *base::CommandLine::ForCurrentProcess();
+  command_line.CopySwitchesFrom(current_command_line, kSwitchNames,
+                                arraysize(kSwitchNames));
 
   return command_line;
 }
diff --git a/chrome/app/chromium_strings.grd b/chrome/app/chromium_strings.grd
index 4803f42..ecaf16ad 100644
--- a/chrome/app/chromium_strings.grd
+++ b/chrome/app/chromium_strings.grd
@@ -297,12 +297,6 @@
           Chromium OS can't open this page.
         </message>
       </if>
-      <!-- Strings used to warn that an OS is not supported -->
-      <if expr="is_win">
-        <message name="IDS_UNSUPPORTED_OS_PRE_WIN_XP" desc="The text used to warn the user that Windows pre-XP is not supported">
-          Chromium requires Windows XP or later. Some features may not work.
-        </message>
-      </if>
       <if expr="not chromeos">
         <message name="IDS_OPTIONS_RELAUNCH_REQUIRED" desc="The message displayed for an option that requires a relaunch to take effect. This appears in a message box if an option is changed that requires a relaunch.">
           Please close all Chromium windows and relaunch Chromium for this change to take effect.
diff --git a/chrome/app/google_chrome_strings.grd b/chrome/app/google_chrome_strings.grd
index 6a45782..f2d4eff 100644
--- a/chrome/app/google_chrome_strings.grd
+++ b/chrome/app/google_chrome_strings.grd
@@ -301,12 +301,6 @@
           Google Chrome OS can't open this page.
         </message>
       </if>
-      <!-- Strings used to warn that an OS is not supported -->
-      <if expr="is_win">
-        <message name="IDS_UNSUPPORTED_OS_PRE_WIN_XP" desc="The text used to warn the user that Windows pre-XP is not supported">
-          Google Chrome requires Windows XP or later. Some features may not work.
-        </message>
-      </if>
       <if expr="not chromeos">
         <message name="IDS_OPTIONS_RELAUNCH_REQUIRED" desc="The message displayed for an option that requires a relaunch to take effect. This appears in a message box if an option is changed that requires a relaunch.">
           Please close all Google Chrome windows and relaunch it for this change to take effect.
diff --git a/chrome/app/media_router_strings.grdp b/chrome/app/media_router_strings.grdp
index a4acbfc..6f6b689 100644
--- a/chrome/app/media_router_strings.grdp
+++ b/chrome/app/media_router_strings.grdp
@@ -137,17 +137,8 @@
   <message name="IDS_MEDIA_ROUTER_ISSUE_FILE_CAST_GENERIC_ERROR" desc="Title of a generic issue to show when a selected file cannot be cast.">
     Unable to cast file.
   </message>
-  <message name="IDS_MEDIA_ROUTER_ISSUE_FILE_CAST_FILE_MISSING" desc="Title of an issue to show when a selected file cannot be cast because it does not exist.">
-    Unable to cast <ph name="FILE_NAME">$1<ex>my_media.mp3</ex></ph>: File does not exist.
-  </message>
-  <message name="IDS_MEDIA_ROUTER_ISSUE_FILE_CAST_NOT_MEDIA" desc="Title of an issue to show when a selected file cannot be cast because it does not contain compatible media.">
-    Unable to cast <ph name="FILE_NAME">$1<ex>my_media.mp3</ex></ph>: File does not contain media.
-  </message>
-  <message name="IDS_MEDIA_ROUTER_ISSUE_FILE_CAST_NOT_SUPPORTED" desc="Title of an issue to show when a selected file cannot be cast because the file type is not supported by the chrome player media player.">
-    Unable to cast <ph name="FILE_NAME">$1<ex>my_media.mp3</ex></ph>: File type is not supported.
-  </message>
-  <message name="IDS_MEDIA_ROUTER_ISSUE_FILE_CAST_READ_ERROR" desc="Title of an issue to show when a selected file cannot be cast because it cannot be read.">
-    Unable to cast <ph name="FILE_NAME">$1<ex>my_media.mp3</ex></ph>: Cannot read file.
+  <message name="IDS_MEDIA_ROUTER_ISSUE_FILE_CAST_ERROR" desc="Title of an issue to show when a selected file cannot be cast, file specified by FILE_NAME.">
+    Unable to cast <ph name="FILE_NAME">$1<ex>my_media.mp3</ex></ph>.
   </message>
 
   <!-- Route Details -->
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index ab5cd02..721aa7b 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -268,6 +268,8 @@
     "component_updater/sw_reporter_installer_win.h",
     "conflicts/enumerate_input_method_editors_win.cc",
     "conflicts/enumerate_input_method_editors_win.h",
+    "conflicts/enumerate_shell_extensions_win.cc",
+    "conflicts/enumerate_shell_extensions_win.h",
     "conflicts/installed_programs_win.cc",
     "conflicts/installed_programs_win.h",
     "conflicts/module_database_observer_win.h",
@@ -283,8 +285,6 @@
     "conflicts/module_inspector_win.h",
     "conflicts/msi_util_win.cc",
     "conflicts/msi_util_win.h",
-    "conflicts/shell_extension_enumerator_win.cc",
-    "conflicts/shell_extension_enumerator_win.h",
     "conflicts/third_party_metrics_recorder_win.cc",
     "conflicts/third_party_metrics_recorder_win.h",
     "content_settings/chrome_content_settings_utils.cc",
@@ -750,6 +750,8 @@
     "net/spdyproxy/data_reduction_proxy_chrome_settings_factory.h",
     "net/sth_distributor_provider.cc",
     "net/sth_distributor_provider.h",
+    "net/system_network_context_manager.cc",
+    "net/system_network_context_manager.h",
     "net/timed_cache.cc",
     "net/timed_cache.h",
     "net/url_info.cc",
@@ -1624,6 +1626,7 @@
     "//content/public/common:feature_h264_with_openh264_ffmpeg",
     "//content/public/common:features",
     "//content/public/common:service_names",
+    "//content/public/network",
     "//courgette:courgette_lib",
     "//crypto",
     "//crypto:platform",
diff --git a/chrome/browser/DEPS b/chrome/browser/DEPS
index 9a8a65d6..3a9c7de 100644
--- a/chrome/browser/DEPS
+++ b/chrome/browser/DEPS
@@ -88,6 +88,10 @@
   # sending synchronous IPC messages on non-UI threads.
   "-ipc/ipc_sync_message_filter.h",
 
+  # Allows in-process use of NetworkService for URLRequestContext configuration.
+  # Should be removed once the actual network service ships.
+  "+content/public/network",
+
   # Other libraries.
   "+libxml",
   "+third_party/google_toolbox_for_mac/src",
diff --git a/chrome/browser/android/chrome_jni_registrar.cc b/chrome/browser/android/chrome_jni_registrar.cc
index 841bfda..f5718a0 100644
--- a/chrome/browser/android/chrome_jni_registrar.cc
+++ b/chrome/browser/android/chrome_jni_registrar.cc
@@ -182,22 +182,12 @@
 #include "components/spellcheck/spellcheck_build_features.h"
 #include "components/sync/android/sync_jni_registrar.h"
 #include "components/variations/android/component_jni_registrar.h"
-#include "device/vr/features/features.h"
 #include "printing/features/features.h"
 
 #if BUILDFLAG(ENABLE_PRINTING) && !BUILDFLAG(ENABLE_PRINT_PREVIEW)
 #include "printing/printing_context_android.h"
 #endif
 
-#if BUILDFLAG(ENABLE_VR)
-#include "chrome/browser/android/vr_shell/vr_core_info.h"
-#include "chrome/browser/android/vr_shell/vr_shell.h"
-#include "chrome/browser/android/vr_shell/vr_shell_delegate.h"
-#include "third_party/gvr-android-sdk/display_synchronizer_jni.h"
-#include "third_party/gvr-android-sdk/gvr_api_jni.h"
-#include "third_party/gvr-android-sdk/native_callbacks_jni.h"
-#endif
-
 #if BUILDFLAG(ENABLE_OFFLINE_PAGES_HARNESS)
 #include "chrome/browser/android/offline_pages/evaluation/offline_page_evaluation_bridge.h"
 #endif
@@ -413,15 +403,6 @@
     {"UsbChooserDialogAndroid", UsbChooserDialogAndroid::Register},
     {"Variations", variations::android::RegisterVariations},
     {"VariationsSession", chrome::android::RegisterVariationsSession},
-#if BUILDFLAG(ENABLE_VR)
-    {"VrCoreInfo", vr_shell::RegisterVrCoreInfo},
-    {"VrShell", vr_shell::RegisterVrShell},
-    {"VrShellDelegate", vr_shell::RegisterVrShellDelegate},
-    {"DisplaySynchronizer",
-     DisplaySynchronizer::RegisterDisplaySynchronizerNatives},
-    {"GvrApi", GvrApi::RegisterGvrApiNatives},
-    {"NativeCallbacks", NativeCallbacks::RegisterNativeCallbacksNatives},
-#endif
     {"WarmupManager", RegisterWarmupManager},
     {"WebApkInstaller", WebApkInstaller::Register},
     {"WebApkUpdateManager", WebApkUpdateManager::Register},
diff --git a/chrome/browser/android/offline_pages/evaluation/offline_page_evaluation_bridge.cc b/chrome/browser/android/offline_pages/evaluation/offline_page_evaluation_bridge.cc
index 5755f67..bf6c1c8 100644
--- a/chrome/browser/android/offline_pages/evaluation/offline_page_evaluation_bridge.cc
+++ b/chrome/browser/android/offline_pages/evaluation/offline_page_evaluation_bridge.cc
@@ -267,7 +267,7 @@
     const OfflinePageItem& added_page) {}
 
 void OfflinePageEvaluationBridge::OfflinePageDeleted(
-    const DeletedPageInfo& page_info) {}
+    const OfflinePageModel::DeletedPageInfo& page_info) {}
 
 // Implement RequestCoordinator::Observer
 void OfflinePageEvaluationBridge::OnAdded(const SavePageRequest& request) {
diff --git a/chrome/browser/android/offline_pages/evaluation/offline_page_evaluation_bridge.h b/chrome/browser/android/offline_pages/evaluation/offline_page_evaluation_bridge.h
index 17df3b3..a56f9cbb 100644
--- a/chrome/browser/android/offline_pages/evaluation/offline_page_evaluation_bridge.h
+++ b/chrome/browser/android/offline_pages/evaluation/offline_page_evaluation_bridge.h
@@ -44,7 +44,8 @@
   void OfflinePageModelLoaded(OfflinePageModel* model) override;
   void OfflinePageAdded(OfflinePageModel* model,
                         const OfflinePageItem& added_page) override;
-  void OfflinePageDeleted(const DeletedPageInfo& page_info) override;
+  void OfflinePageDeleted(
+      const OfflinePageModel::DeletedPageInfo& page_info) override;
 
   // RequestCoordinator::Observer implementation.
   void OnAdded(const SavePageRequest& request) override;
diff --git a/chrome/browser/android/vr_shell/vr_core_info.cc b/chrome/browser/android/vr_shell/vr_core_info.cc
index 6f8b491..e4e724452 100644
--- a/chrome/browser/android/vr_shell/vr_core_info.cc
+++ b/chrome/browser/android/vr_shell/vr_core_info.cc
@@ -22,10 +22,6 @@
 // Native JNI methods
 // ----------------------------------------------------------------------------
 
-bool RegisterVrCoreInfo(JNIEnv* env) {
-  return RegisterNativesImpl(env);
-}
-
 jlong Init(JNIEnv* env,
            const JavaParamRef<jobject>& obj,
            jint major_version,
diff --git a/chrome/browser/android/vr_shell/vr_core_info.h b/chrome/browser/android/vr_shell/vr_core_info.h
index b52d4b9..922d774 100644
--- a/chrome/browser/android/vr_shell/vr_core_info.h
+++ b/chrome/browser/android/vr_shell/vr_core_info.h
@@ -31,8 +31,6 @@
              VrCoreCompatibility compatibility);
 };
 
-bool RegisterVrCoreInfo(JNIEnv* env);
-
 }  // namespace vr_shell
 
 #endif  // CHROME_BROWSER_ANDROID_VR_SHELL_VR_CORE_INFO_H_
diff --git a/chrome/browser/android/vr_shell/vr_shell.cc b/chrome/browser/android/vr_shell/vr_shell.cc
index e82a3d4..a8279e0 100644
--- a/chrome/browser/android/vr_shell/vr_shell.cc
+++ b/chrome/browser/android/vr_shell/vr_shell.cc
@@ -191,10 +191,6 @@
   }
 }
 
-bool RegisterVrShell(JNIEnv* env) {
-  return RegisterNativesImpl(env);
-}
-
 VrShell::~VrShell() {
   DVLOG(1) << __FUNCTION__ << "=" << this;
   poll_capturing_media_task_.Cancel();
diff --git a/chrome/browser/android/vr_shell/vr_shell.h b/chrome/browser/android/vr_shell/vr_shell.h
index ad42ddc..c92ea63 100644
--- a/chrome/browser/android/vr_shell/vr_shell.h
+++ b/chrome/browser/android/vr_shell/vr_shell.h
@@ -264,8 +264,6 @@
   DISALLOW_COPY_AND_ASSIGN(VrShell);
 };
 
-bool RegisterVrShell(JNIEnv* env);
-
 }  // namespace vr_shell
 
 #endif  // CHROME_BROWSER_ANDROID_VR_SHELL_VR_SHELL_H_
diff --git a/chrome/browser/android/vr_shell/vr_shell_delegate.cc b/chrome/browser/android/vr_shell/vr_shell_delegate.cc
index 1453d8e7..33605a50 100644
--- a/chrome/browser/android/vr_shell/vr_shell_delegate.cc
+++ b/chrome/browser/android/vr_shell/vr_shell_delegate.cc
@@ -245,10 +245,6 @@
 // Native JNI methods
 // ----------------------------------------------------------------------------
 
-bool RegisterVrShellDelegate(JNIEnv* env) {
-  return RegisterNativesImpl(env);
-}
-
 jlong Init(JNIEnv* env, const JavaParamRef<jobject>& obj) {
   return reinterpret_cast<intptr_t>(new VrShellDelegate(env, obj));
 }
diff --git a/chrome/browser/android/vr_shell/vr_shell_delegate.h b/chrome/browser/android/vr_shell/vr_shell_delegate.h
index e5ca2c4c..2c25d86 100644
--- a/chrome/browser/android/vr_shell/vr_shell_delegate.h
+++ b/chrome/browser/android/vr_shell/vr_shell_delegate.h
@@ -96,8 +96,6 @@
   DISALLOW_COPY_AND_ASSIGN(VrShellDelegate);
 };
 
-bool RegisterVrShellDelegate(JNIEnv* env);
-
 }  // namespace vr_shell
 
 #endif  // CHROME_BROWSER_ANDROID_VR_SHELL_VR_SHELL_DELEGATE_H_
diff --git a/chrome/browser/android/vr_shell/vr_shell_gl.cc b/chrome/browser/android/vr_shell/vr_shell_gl.cc
index 13b3df6..d620717 100644
--- a/chrome/browser/android/vr_shell/vr_shell_gl.cc
+++ b/chrome/browser/android/vr_shell/vr_shell_gl.cc
@@ -1074,7 +1074,8 @@
 
 void VrShellGl::DrawElement(const gfx::Transform& view_proj_matrix,
                             const vr::UiElement& element) {
-  gfx::Transform transform = view_proj_matrix * element.transform();
+  gfx::Transform transform =
+      view_proj_matrix * element.screen_space_transform();
 
   switch (element.fill()) {
     case vr::Fill::OPAQUE_GRADIENT: {
@@ -1122,8 +1123,8 @@
               if (first->draw_phase() != second->draw_phase()) {
                 return first->draw_phase() < second->draw_phase();
               } else {
-                return first->transform().matrix().get(2, 3) <
-                       second->transform().matrix().get(2, 3);
+                return first->screen_space_transform().matrix().get(2, 3) <
+                       second->screen_space_transform().matrix().get(2, 3);
               }
             });
 
diff --git a/chrome/browser/app_controller_mac.mm b/chrome/browser/app_controller_mac.mm
index 1dc878b9..9623b8b 100644
--- a/chrome/browser/app_controller_mac.mm
+++ b/chrome/browser/app_controller_mac.mm
@@ -1528,14 +1528,14 @@
 
 - (BOOL)application:(NSApplication*)application
     willContinueUserActivityWithType:(NSString*)userActivityType
-    __attribute__((availability(macos, introduced = 10.10))) {
+    API_AVAILABLE(macos(10.10)) {
   return [userActivityType isEqualToString:NSUserActivityTypeBrowsingWeb];
 }
 
 - (BOOL)application:(NSApplication*)application
     continueUserActivity:(NSUserActivity*)userActivity
       restorationHandler:(void (^)(NSArray*))restorationHandler
-    __attribute__((availability(macos, introduced = 10.10))) {
+    API_AVAILABLE(macos(10.10)) {
   if (![userActivity.activityType
           isEqualToString:NSUserActivityTypeBrowsingWeb]) {
     return NO;
diff --git a/chrome/browser/apps/app_url_redirector_browsertest.cc b/chrome/browser/apps/app_url_redirector_browsertest.cc
index 832bbf0b..a69b784 100644
--- a/chrome/browser/apps/app_url_redirector_browsertest.cc
+++ b/chrome/browser/apps/app_url_redirector_browsertest.cc
@@ -18,10 +18,6 @@
 #include "net/test/embedded_test_server/embedded_test_server.h"
 #include "ui/base/page_transition_types.h"
 
-#if defined(OS_WIN)
-#include "base/win/windows_version.h"
-#endif
-
 namespace extensions {
 
 class PlatformAppUrlRedirectorBrowserTest : public PlatformAppBrowserTest {
@@ -323,9 +319,6 @@
 // matching url_handlers.
 IN_PROC_BROWSER_TEST_F(PlatformAppUrlRedirectorBrowserTest,
                        ClickInTabIntercepted) {
-#if defined (OS_WIN)
-  if (base::win::GetVersion() < base::win::VERSION_VISTA) return;  // Bug 301638
-#endif
   TestNavigationInTab(
       "url_handlers/launching_pages/click_link.html",
       "url_handlers/handlers/simple",
@@ -336,9 +329,6 @@
 // matching url_handlers.
 IN_PROC_BROWSER_TEST_F(PlatformAppUrlRedirectorBrowserTest,
                        BlankClickInTabIntercepted) {
-#if defined (OS_WIN)
-  if (base::win::GetVersion() < base::win::VERSION_VISTA) return;  // Bug 301638
-#endif
   TestNavigationInTab(
       "url_handlers/launching_pages/click_blank_link.html",
       "url_handlers/handlers/simple",
@@ -349,9 +339,6 @@
 // matching url_handlers.
 IN_PROC_BROWSER_TEST_F(PlatformAppUrlRedirectorBrowserTest,
                        WindowOpenInTabIntercepted) {
-#if defined (OS_WIN)
-  if (base::win::GetVersion() < base::win::VERSION_VISTA) return;  // Bug 301638
-#endif
   TestNavigationInTab(
       "url_handlers/launching_pages/call_window_open.html",
       "url_handlers/handlers/simple",
@@ -362,9 +349,6 @@
 // matching url_handlers.
 IN_PROC_BROWSER_TEST_F(PlatformAppUrlRedirectorBrowserTest,
                        MismatchingClickInTabNotIntercepted) {
-#if defined (OS_WIN)
-  if (base::win::GetVersion() < base::win::VERSION_VISTA) return;  // Bug 301638
-#endif
   TestMismatchingNavigationInTab(
       "url_handlers/launching_pages/click_mismatching_link.html",
       "Mismatching link target loaded",
@@ -375,9 +359,6 @@
 // another app that has matching url_handlers.
 IN_PROC_BROWSER_TEST_F(PlatformAppUrlRedirectorBrowserTest,
                        BlankClickInAppIntercepted) {
-#if defined (OS_WIN)
-  if (base::win::GetVersion() < base::win::VERSION_VISTA) return;  // Bug 301638
-#endif
   TestNavigationInApp(
       "url_handlers/launchers/click_blank_link",
       "Launcher done",
@@ -389,9 +370,6 @@
 // another app that has matching url_handlers.
 IN_PROC_BROWSER_TEST_F(PlatformAppUrlRedirectorBrowserTest,
                        WindowOpenInAppIntercepted) {
-#if defined (OS_WIN)
-  if (base::win::GetVersion() < base::win::VERSION_VISTA) return;  // Bug 301638
-#endif
   TestNavigationInApp(
       "url_handlers/launchers/call_window_open",
       "Launcher done",
@@ -403,9 +381,6 @@
 // click on a target='_blank' link in another app's window.
 IN_PROC_BROWSER_TEST_F(PlatformAppUrlRedirectorBrowserTest,
                        MismatchingWindowOpenInAppNotIntercepted) {
-#if defined (OS_WIN)
-  if (base::win::GetVersion() < base::win::VERSION_VISTA) return;  // Bug 301638
-#endif
   TestMismatchingNavigationInApp(
       "url_handlers/launchers/call_mismatching_window_open",
       "Launcher done",
@@ -416,9 +391,6 @@
 // even when there are other (or the same) apps that have matching url_handlers.
 IN_PROC_BROWSER_TEST_F(PlatformAppUrlRedirectorBrowserTest,
                        WebviewNavigationNotIntercepted) {
-#if defined (OS_WIN)
-  if (base::win::GetVersion() < base::win::VERSION_VISTA) return;  // Bug 301638
-#endif
   // The launcher clicks on a link, which gets intercepted and launches the
   // handler. The handler also redirects an embedded webview to the URL. The
   // webview should just navigate without creating an endless loop of
@@ -435,9 +407,6 @@
 // even when there are other (or the same) apps that have matching url_handlers.
 IN_PROC_BROWSER_TEST_F(PlatformAppUrlRedirectorBrowserTest,
                        MismatchingBlankClickInAppNotIntercepted) {
-#if defined (OS_WIN)
-  if (base::win::GetVersion() < base::win::VERSION_VISTA) return;  // Bug 301638
-#endif
   // The launcher clicks on a link, which gets intercepted and launches the
   // handler. The handler also redirects an embedded webview to the URL. The
   // webview should just navigate without creating an endless loop of
@@ -453,9 +422,6 @@
 // url_handlers.
 IN_PROC_BROWSER_TEST_F(PlatformAppUrlRedirectorBrowserTest,
                        EntryInOmnibarIntercepted) {
-#if defined (OS_WIN)
-  if (base::win::GetVersion() < base::win::VERSION_VISTA) return;  // Bug 301638
-#endif
   TestNavigationInBrowser(
       "url_handlers/common/target.html",
       ui::PAGE_TRANSITION_TYPED,
@@ -467,9 +433,6 @@
 // URL entry in the omnibar.
 IN_PROC_BROWSER_TEST_F(PlatformAppUrlRedirectorBrowserTest,
                        MismatchingEntryInOmnibarNotIntercepted) {
-#if defined (OS_WIN)
-  if (base::win::GetVersion() < base::win::VERSION_VISTA) return;  // Bug 301638
-#endif
   TestMismatchingNavigationInBrowser(
       "url_handlers/common/mismatching_target.html",
       ui::PAGE_TRANSITION_TYPED,
@@ -481,9 +444,6 @@
 // by apps even with matching url_handlers.
 IN_PROC_BROWSER_TEST_F(PlatformAppUrlRedirectorBrowserTest,
                        FormSubmissionInTabNotIntercepted) {
-#if defined (OS_WIN)
-  if (base::win::GetVersion() < base::win::VERSION_VISTA) return;  // Bug 301638
-#endif
   TestMismatchingNavigationInTab(
       "url_handlers/launching_pages/submit_form.html",
       "Link target loaded",
@@ -494,9 +454,6 @@
 // by apps even with matching url_handlers.
 IN_PROC_BROWSER_TEST_F(PlatformAppUrlRedirectorBrowserTest,
                        XhrInTabNotIntercepted) {
-#if defined (OS_WIN)
-  if (base::win::GetVersion() < base::win::VERSION_VISTA) return;  // Bug 301638
-#endif
   TestNegativeXhrInTab(
       "url_handlers/xhr_downloader/main.html",
       "XHR succeeded",
@@ -507,9 +464,6 @@
 // Test that a click on a prerendered link still launches.
 IN_PROC_BROWSER_TEST_F(PlatformAppUrlRedirectorBrowserTest,
                        PrerenderedClickInTabIntercepted) {
-#if defined (OS_WIN)
-  if (base::win::GetVersion() < base::win::VERSION_VISTA) return;  // Bug 301638
-#endif
   TestNavigationInTab(
       "url_handlers/launching_pages/prerender_link.html",
       "url_handlers/handlers/simple",
diff --git a/chrome/browser/browser_process_platform_part_base.cc b/chrome/browser/browser_process_platform_part_base.cc
index e2acee9..4a9e44ff 100644
--- a/chrome/browser/browser_process_platform_part_base.cc
+++ b/chrome/browser/browser_process_platform_part_base.cc
@@ -41,3 +41,6 @@
   return std::unique_ptr<policy::BrowserPolicyConnector>(
       new policy::ChromeBrowserPolicyConnector());
 }
+
+void BrowserProcessPlatformPartBase::RegisterInProcessServices(
+    content::ContentBrowserClient::StaticServiceMap* services) {}
diff --git a/chrome/browser/browser_process_platform_part_base.h b/chrome/browser/browser_process_platform_part_base.h
index af9d60c..d8becac 100644
--- a/chrome/browser/browser_process_platform_part_base.h
+++ b/chrome/browser/browser_process_platform_part_base.h
@@ -8,6 +8,7 @@
 #include <memory>
 
 #include "base/macros.h"
+#include "content/public/browser/content_browser_client.h"
 
 namespace base {
 class CommandLine;
@@ -41,6 +42,10 @@
   virtual std::unique_ptr<policy::BrowserPolicyConnector>
   CreateBrowserPolicyConnector();
 
+  // Called from ChromeContentBrowserClient::RegisterInProcessServices
+  virtual void RegisterInProcessServices(
+      content::ContentBrowserClient::StaticServiceMap* services);
+
  private:
   DISALLOW_COPY_AND_ASSIGN(BrowserProcessPlatformPartBase);
 };
diff --git a/chrome/browser/browser_process_platform_part_chromeos.cc b/chrome/browser/browser_process_platform_part_chromeos.cc
index af96a8b..47e06b6 100644
--- a/chrome/browser/browser_process_platform_part_chromeos.cc
+++ b/chrome/browser/browser_process_platform_part_chromeos.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/browser_process_platform_part_chromeos.h"
 
+#include "ash/public/interfaces/constants.mojom.h"
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
 #include "base/time/default_tick_clock.h"
@@ -25,20 +26,111 @@
 #include "chrome/browser/chromeos/system/timezone_util.h"
 #include "chrome/browser/lifetime/keep_alive_types.h"
 #include "chrome/browser/lifetime/scoped_keep_alive.h"
+#include "chrome/browser/prefs/active_profile_pref_service.h"
+#include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/browser/ui/ash/ash_util.h"
+#include "chrome/browser/ui/browser_commands.h"
+#include "chrome/browser/ui/browser_finder.h"
+#include "chrome/browser/ui/browser_window.h"
+#include "chrome/common/chrome_features.h"
 #include "chrome/common/chrome_switches.h"
 #include "chromeos/geolocation/simple_geolocation_provider.h"
 #include "chromeos/timezone/timezone_resolver.h"
 #include "components/session_manager/core/session_manager.h"
 #include "components/user_manager/user_manager.h"
+#include "mash/public/interfaces/launchable.mojom.h"
+#include "services/preferences/public/interfaces/preferences.mojom.h"
+#include "services/service_manager/public/cpp/binder_registry.h"
+#include "services/service_manager/public/cpp/interface_provider.h"
+#include "services/service_manager/public/cpp/service.h"
+#include "services/ui/public/interfaces/constants.mojom.h"
 
 #if defined(USE_OZONE)
-#include "ash/public/interfaces/constants.mojom.h"
 #include "content/public/common/service_manager_connection.h"
 #include "services/service_manager/runner/common/client_util.h"
+#include "services/ui/public/cpp/input_devices/input_device_controller.h"
 #include "services/ui/public/cpp/input_devices/input_device_controller_client.h"
 #include "services/ui/public/interfaces/constants.mojom.h"
 #endif
 
+namespace {
+// Packaged service implementation used to expose miscellaneous application
+// control features. This is a singleton service which runs on the main thread
+// and never stops.
+class ChromeServiceChromeOS : public service_manager::Service,
+                              public mash::mojom::Launchable {
+ public:
+  ChromeServiceChromeOS() {
+#if defined(USE_OZONE)
+    input_device_controller_.AddInterface(&interfaces_);
+#endif
+    interfaces_.AddInterface<mash::mojom::Launchable>(
+        base::Bind(&ChromeServiceChromeOS::Create, base::Unretained(this)));
+  }
+  ~ChromeServiceChromeOS() override {}
+
+  static std::unique_ptr<service_manager::Service> CreateService() {
+    return base::MakeUnique<ChromeServiceChromeOS>();
+  }
+
+ private:
+  void CreateNewWindowImpl(bool is_incognito) {
+    Profile* profile = ProfileManager::GetActiveUserProfile();
+    chrome::NewEmptyWindow(is_incognito ? profile->GetOffTheRecordProfile()
+                                        : profile);
+  }
+
+  // service_manager::Service:
+  void OnBindInterface(const service_manager::BindSourceInfo& remote_info,
+                       const std::string& name,
+                       mojo::ScopedMessagePipeHandle handle) override {
+    interfaces_.BindInterface(remote_info, name, std::move(handle));
+  }
+
+  // mash::mojom::Launchable:
+  void Launch(uint32_t what, mash::mojom::LaunchMode how) override {
+    bool is_incognito;
+    switch (what) {
+      case mash::mojom::kWindow:
+        is_incognito = false;
+        break;
+      case mash::mojom::kIncognitoWindow:
+        is_incognito = true;
+        break;
+      default:
+        NOTREACHED();
+    }
+
+    bool reuse = how != mash::mojom::LaunchMode::MAKE_NEW;
+    if (reuse) {
+      Profile* profile = ProfileManager::GetActiveUserProfile();
+      Browser* browser = chrome::FindTabbedBrowser(
+          is_incognito ? profile->GetOffTheRecordProfile() : profile, false);
+      if (browser) {
+        browser->window()->Show();
+        return;
+      }
+    }
+
+    CreateNewWindowImpl(is_incognito);
+  }
+
+  void Create(const service_manager::BindSourceInfo& source_info,
+              mash::mojom::LaunchableRequest request) {
+    bindings_.AddBinding(this, std::move(request));
+  }
+
+  service_manager::BinderRegistry interfaces_;
+  mojo::BindingSet<mash::mojom::Launchable> bindings_;
+#if defined(USE_OZONE)
+  ui::InputDeviceController input_device_controller_;
+#endif
+
+  DISALLOW_COPY_AND_ASSIGN(ChromeServiceChromeOS);
+};
+
+}  // namespace
+
 BrowserProcessPlatformPart::BrowserProcessPlatformPart()
     : created_profile_helper_(false) {}
 
@@ -156,6 +248,34 @@
       new policy::BrowserPolicyConnectorChromeOS());
 }
 
+void BrowserProcessPlatformPart::RegisterInProcessServices(
+    content::ContentBrowserClient::StaticServiceMap* services) {
+  {
+    service_manager::EmbeddedServiceInfo info;
+    info.factory = base::Bind(&ChromeServiceChromeOS::CreateService);
+    info.task_runner = base::ThreadTaskRunnerHandle::Get();
+    services->insert(std::make_pair(chromeos::kChromeServiceName, info));
+  }
+
+  if (features::PrefServiceEnabled()) {
+    service_manager::EmbeddedServiceInfo info;
+    info.factory = base::Bind([] {
+      return std::unique_ptr<service_manager::Service>(
+          base::MakeUnique<ActiveProfilePrefService>());
+    });
+    info.task_runner = base::ThreadTaskRunnerHandle::Get();
+    services->insert(std::make_pair(prefs::mojom::kForwarderServiceName, info));
+  }
+
+  if (!ash_util::IsRunningInMash()) {
+    service_manager::EmbeddedServiceInfo info;
+    info.factory = base::Bind(&ash_util::CreateEmbeddedAshService,
+                              base::ThreadTaskRunnerHandle::Get());
+    info.task_runner = base::ThreadTaskRunnerHandle::Get();
+    services->insert(std::make_pair(ash::mojom::kServiceName, info));
+  }
+}
+
 chromeos::system::SystemClock* BrowserProcessPlatformPart::GetSystemClock() {
   if (!system_clock_.get())
     system_clock_.reset(new chromeos::system::SystemClock());
diff --git a/chrome/browser/browser_process_platform_part_chromeos.h b/chrome/browser/browser_process_platform_part_chromeos.h
index 2aa21c1..657c817 100644
--- a/chrome/browser/browser_process_platform_part_chromeos.h
+++ b/chrome/browser/browser_process_platform_part_chromeos.h
@@ -96,9 +96,10 @@
 
   // Overridden from BrowserProcessPlatformPartBase:
   void StartTearDown() override;
-
   std::unique_ptr<policy::BrowserPolicyConnector> CreateBrowserPolicyConnector()
       override;
+  void RegisterInProcessServices(
+      content::ContentBrowserClient::StaticServiceMap* services) override;
 
   chromeos::system::SystemClock* GetSystemClock();
   void DestroySystemClock();
diff --git a/chrome/browser/chrome_browser_main_win.cc b/chrome/browser/chrome_browser_main_win.cc
index 96d3b40..3e481f2 100644
--- a/chrome/browser/chrome_browser_main_win.cc
+++ b/chrome/browser/chrome_browser_main_win.cc
@@ -36,9 +36,9 @@
 #include "base/win/wrapped_window_proc.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/conflicts/enumerate_input_method_editors_win.h"
+#include "chrome/browser/conflicts/enumerate_shell_extensions_win.h"
 #include "chrome/browser/conflicts/module_database_win.h"
 #include "chrome/browser/conflicts/module_event_sink_impl_win.h"
-#include "chrome/browser/conflicts/shell_extension_enumerator_win.h"
 #include "chrome/browser/first_run/first_run.h"
 #include "chrome/browser/install_verification/win/install_verification.h"
 #include "chrome/browser/profiles/profile_manager.h"
@@ -206,10 +206,9 @@
 }
 
 // Helper function for initializing the module database subsystem. Populates
-// the provided |module_watcher| and |shell_extension_enumerator|.
-void SetupModuleDatabase(
-    std::unique_ptr<ModuleWatcher>* module_watcher,
-    std::unique_ptr<ShellExtensionEnumerator>* shell_extension_enumerator) {
+// the provided |module_watcher|, and starts the enumeration of registered
+// modules in the Windows Registry.
+void SetupModuleDatabase(std::unique_ptr<ModuleWatcher>* module_watcher) {
   uint64_t creation_time = 0;
   ModuleEventSinkImpl::GetProcessCreationTime(::GetCurrentProcess(),
                                               &creation_time);
@@ -230,7 +229,7 @@
 
   // Enumerate shell extensions and input method editors. It is safe to use
   // base::Unretained() here because the ModuleDatabase is never freed.
-  *shell_extension_enumerator = base::MakeUnique<ShellExtensionEnumerator>(
+  EnumerateShellExtensions(
       base::BindRepeating(&ModuleDatabase::OnShellExtensionEnumerated,
                           base::Unretained(module_database)));
   EnumerateInputMethodEditors(base::BindRepeating(
@@ -349,17 +348,7 @@
   base::debug::SetCrashKeyValue(
       crash_keys::kCohortName, base::UTF16ToUTF8(details.update_cohort_name()));
 
-  int rv = ChromeBrowserMainParts::PreCreateThreads();
-
-  // TODO(viettrungluu): why don't we run this earlier?
-  if (!parsed_command_line().HasSwitch(switches::kNoErrorDialogs) &&
-      base::win::GetVersion() < base::win::VERSION_XP) {
-    chrome::ShowWarningMessageBox(
-        NULL, l10n_util::GetStringUTF16(IDS_PRODUCT_NAME),
-        l10n_util::GetStringUTF16(IDS_UNSUPPORTED_OS_PRE_WIN_XP));
-  }
-
-  return rv;
+  return ChromeBrowserMainParts::PreCreateThreads();
 }
 
 void ChromeBrowserMainPartsWin::ShowMissingLocaleMessageBox() {
@@ -376,7 +365,7 @@
   // needs to be done before any child processes are initialized as the
   // ModuleDatabase is an endpoint for IPC from child processes.
   if (base::FeatureList::IsEnabled(features::kModuleDatabase))
-    SetupModuleDatabase(&module_watcher_, &shell_extension_enumerator_);
+    SetupModuleDatabase(&module_watcher_);
 }
 
 void ChromeBrowserMainPartsWin::PostBrowserStart() {
@@ -491,16 +480,9 @@
 int ChromeBrowserMainPartsWin::HandleIconsCommands(
     const base::CommandLine& parsed_command_line) {
   if (parsed_command_line.HasSwitch(switches::kHideIcons)) {
-    base::string16 cp_applet;
-    base::win::Version version = base::win::GetVersion();
-    if (version >= base::win::VERSION_VISTA) {
-      cp_applet.assign(L"Programs and Features");  // Windows Vista and later.
-    } else if (version >= base::win::VERSION_XP) {
-      cp_applet.assign(L"Add/Remove Programs");  // Windows XP.
-    } else {
-      return chrome::RESULT_CODE_UNSUPPORTED_PARAM;  // Not supported
-    }
-
+    // TODO(740976): This is not up-to-date and not localized. Figure out if
+    // the --hide-icons and --show-icons switches are still used.
+    base::string16 cp_applet(L"Programs and Features");
     const base::string16 msg =
         l10n_util::GetStringFUTF16(IDS_HIDE_ICONS_NOT_SUPPORTED, cp_applet);
     const base::string16 caption = l10n_util::GetStringUTF16(IDS_PRODUCT_NAME);
diff --git a/chrome/browser/chrome_browser_main_win.h b/chrome/browser/chrome_browser_main_win.h
index 7d0316b..2e8ac43 100644
--- a/chrome/browser/chrome_browser_main_win.h
+++ b/chrome/browser/chrome_browser_main_win.h
@@ -14,7 +14,6 @@
 #include "chrome/browser/chrome_browser_main.h"
 
 class ModuleWatcher;
-class ShellExtensionEnumerator;
 
 namespace base {
 class CommandLine;
@@ -75,10 +74,6 @@
   // Watches module load events and forwards them to the ModuleDatabase.
   std::unique_ptr<ModuleWatcher> module_watcher_;
 
-  // Enumerates registered shell extensions and forwards them to the
-  // ModuleDatabase.
-  std::unique_ptr<ShellExtensionEnumerator> shell_extension_enumerator_;
-
   DISALLOW_COPY_AND_ASSIGN(ChromeBrowserMainPartsWin);
 };
 
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index 342c8876..2b47130 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -60,7 +60,6 @@
 #include "chrome/browser/password_manager/chrome_password_manager_client.h"
 #include "chrome/browser/permissions/permission_context_base.h"
 #include "chrome/browser/platform_util.h"
-#include "chrome/browser/prefs/active_profile_pref_service.h"
 #include "chrome/browser/prerender/prerender_final_status.h"
 #include "chrome/browser/prerender/prerender_manager.h"
 #include "chrome/browser/prerender/prerender_manager_factory.h"
@@ -95,10 +94,8 @@
 #include "chrome/browser/translate/chrome_translate_client.h"
 #include "chrome/browser/ui/blocked_content/blocked_window_params.h"
 #include "chrome/browser/ui/blocked_content/popup_blocker_tab_helper.h"
-#include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/browser_navigator.h"
 #include "chrome/browser/ui/browser_navigator_params.h"
-#include "chrome/browser/ui/browser_window.h"
 #include "chrome/browser/ui/chrome_select_file_policy.h"
 #include "chrome/browser/ui/sync/sync_promo_ui.h"
 #include "chrome/browser/ui/tab_contents/chrome_web_contents_view_delegate.h"
@@ -209,10 +206,6 @@
 #include "ppapi/features/features.h"
 #include "ppapi/host/ppapi_host.h"
 #include "printing/features/features.h"
-#include "services/preferences/public/interfaces/preferences.mojom.h"
-#include "services/service_manager/public/cpp/binder_registry.h"
-#include "services/service_manager/public/cpp/interface_provider.h"
-#include "services/service_manager/public/cpp/service.h"
 #include "storage/browser/fileapi/external_mount_points.h"
 #include "third_party/WebKit/public/platform/modules/installedapp/installed_app_provider.mojom.h"
 #include "third_party/WebKit/public/platform/modules/webshare/webshare.mojom.h"
@@ -231,7 +224,6 @@
 #elif defined(OS_MACOSX)
 #include "chrome/browser/chrome_browser_main_mac.h"
 #elif defined(OS_CHROMEOS)
-#include "ash/public/interfaces/constants.mojom.h"
 #include "chrome/browser/chromeos/arc/arc_util.h"
 #include "chrome/browser/chromeos/arc/fileapi/arc_content_file_system_backend_delegate.h"
 #include "chrome/browser/chromeos/arc/fileapi/arc_documents_provider_backend_delegate.h"
@@ -250,16 +242,12 @@
 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
 #include "chrome/browser/chromeos/system/input_device_settings.h"
 #include "chrome/browser/metrics/leak_detector/leak_detector_remote_controller.h"
-#include "chrome/browser/profiles/profile_manager.h"
-#include "chrome/browser/ui/ash/ash_util.h"
-#include "chrome/browser/ui/browser_commands.h"
 #include "chrome/browser/ui/browser_dialogs.h"
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/views/ash/chrome_browser_main_extra_parts_ash.h"
 #include "chromeos/chromeos_constants.h"
 #include "chromeos/chromeos_switches.h"
 #include "components/user_manager/user_manager.h"
-#include "mash/public/interfaces/launchable.mojom.h"
 #include "services/service_manager/public/interfaces/interface_provider_spec.mojom.h"
 #elif defined(OS_LINUX)
 #include "chrome/browser/chrome_browser_main_linux.h"
@@ -276,6 +264,7 @@
 #include "components/crash/content/browser/crash_dump_manager_android.h"
 #include "components/navigation_interception/intercept_navigation_delegate.h"
 #include "content/public/browser/android/java_interfaces.h"
+#include "services/service_manager/public/cpp/interface_provider.h"
 #include "third_party/WebKit/public/platform/modules/payments/payment_request.mojom.h"
 #include "ui/base/resource/resource_bundle_android.h"
 #include "ui/base/ui_base_paths.h"
@@ -283,10 +272,6 @@
 #include "chrome/browser/chrome_browser_main_posix.h"
 #endif
 
-#if defined(OS_CHROMEOS) && defined(USE_OZONE)
-#include "services/ui/public/cpp/input_devices/input_device_controller.h"
-#endif
-
 #if !defined(OS_ANDROID)
 #include "chrome/browser/devtools/chrome_devtools_manager_delegate.h"
 #include "chrome/browser/payments/payment_request_factory.h"
@@ -511,85 +496,6 @@
   APP_LOADED_IN_TAB_SOURCE_MAX
 };
 
-#if defined(OS_CHROMEOS)
-
-// Packaged service implementation used to expose miscellaneous application
-// control features. This is a singleton service which runs on the main thread
-// and never stops.
-class ChromeServiceChromeOS : public service_manager::Service,
-                              public mash::mojom::Launchable {
- public:
-  ChromeServiceChromeOS() {
-#if defined(USE_OZONE)
-    input_device_controller_.AddInterface(&interfaces_);
-#endif
-    interfaces_.AddInterface<mash::mojom::Launchable>(
-        base::Bind(&ChromeServiceChromeOS::Create, base::Unretained(this)));
-  }
-  ~ChromeServiceChromeOS() override {}
-
-  static std::unique_ptr<service_manager::Service> CreateService() {
-    return base::MakeUnique<ChromeServiceChromeOS>();
-  }
-
- private:
-  void CreateNewWindowImpl(bool is_incognito) {
-    Profile* profile = ProfileManager::GetActiveUserProfile();
-    chrome::NewEmptyWindow(is_incognito ? profile->GetOffTheRecordProfile()
-                                        : profile);
-  }
-
-  // service_manager::Service:
-  void OnBindInterface(const service_manager::BindSourceInfo& remote_info,
-                       const std::string& name,
-                       mojo::ScopedMessagePipeHandle handle) override {
-    interfaces_.BindInterface(remote_info, name, std::move(handle));
-  }
-
-  // mash::mojom::Launchable:
-  void Launch(uint32_t what, mash::mojom::LaunchMode how) override {
-    bool is_incognito;
-    switch (what) {
-      case mash::mojom::kWindow:
-        is_incognito = false;
-        break;
-      case mash::mojom::kIncognitoWindow:
-        is_incognito = true;
-        break;
-      default:
-        NOTREACHED();
-    }
-
-    bool reuse = how != mash::mojom::LaunchMode::MAKE_NEW;
-    if (reuse) {
-      Profile* profile = ProfileManager::GetActiveUserProfile();
-      Browser* browser = chrome::FindTabbedBrowser(
-          is_incognito ? profile->GetOffTheRecordProfile() : profile, false);
-      if (browser) {
-        browser->window()->Show();
-        return;
-      }
-    }
-
-    CreateNewWindowImpl(is_incognito);
-  }
-
-  void Create(const service_manager::BindSourceInfo& source_info,
-              mash::mojom::LaunchableRequest request) {
-    bindings_.AddBinding(this, std::move(request));
-  }
-
-  service_manager::BinderRegistry interfaces_;
-  mojo::BindingSet<mash::mojom::Launchable> bindings_;
-#if defined(USE_OZONE)
-  ui::InputDeviceController input_device_controller_;
-#endif
-
-  DISALLOW_COPY_AND_ASSIGN(ChromeServiceChromeOS);
-};
-
-#endif  // defined(OS_CHROMEOS)
-
 // Returns a copy of the given url with its host set to given host and path set
 // to given path. Other parts of the url will be the same.
 GURL ReplaceURLHostAndPath(const GURL& url,
@@ -1658,9 +1564,7 @@
   command_line->CopySwitchesFrom(browser_command_line, kCommonSwitchNames,
                                  arraysize(kCommonSwitchNames));
 #if BUILDFLAG(ENABLE_OOP_HEAP_PROFILING)
-  if (process_type != switches::kZygoteProcess) {
-    profiling::ProfilingProcessHost::AddSwitchesToChildCmdLine(command_line);
-  }
+  profiling::ProfilingProcessHost::AddSwitchesToChildCmdLine(command_line);
 #endif
 
   static const char* const kDinosaurEasterEggSwitches[] = {
@@ -2804,6 +2708,13 @@
     const base::CommandLine& command_line,
     int child_process_id,
     FileDescriptorInfo* mappings) {
+#if BUILDFLAG(ENABLE_OOP_HEAP_PROFILING)
+  std::string process_type =
+      command_line.GetSwitchValueASCII(switches::kProcessType);
+  profiling::ProfilingProcessHost::GetAdditionalMappedFilesForChildProcess(
+      command_line, child_process_id, mappings);
+#endif
+
 #if defined(OS_ANDROID)
   base::MemoryMappedFile::Region region;
   int fd = ui::GetMainAndroidPackFd(&region);
@@ -3050,32 +2961,7 @@
   info.factory = base::Bind(&media::CreateMediaService);
   services->insert(std::make_pair(media::mojom::kMediaServiceName, info));
 #endif
-#if defined(OS_CHROMEOS)
-  {
-    service_manager::EmbeddedServiceInfo info;
-    info.factory = base::Bind(&ChromeServiceChromeOS::CreateService);
-    info.task_runner = base::ThreadTaskRunnerHandle::Get();
-    services->insert(std::make_pair(chromeos::kChromeServiceName, info));
-  }
-
-  if (features::PrefServiceEnabled()) {
-    service_manager::EmbeddedServiceInfo info;
-    info.factory = base::Bind([] {
-      return std::unique_ptr<service_manager::Service>(
-          base::MakeUnique<ActiveProfilePrefService>());
-    });
-    info.task_runner = base::ThreadTaskRunnerHandle::Get();
-    services->insert(std::make_pair(prefs::mojom::kForwarderServiceName, info));
-  }
-
-  if (!ash_util::IsRunningInMash()) {
-    service_manager::EmbeddedServiceInfo info;
-    info.factory = base::Bind(&ash_util::CreateEmbeddedAshService,
-                              base::ThreadTaskRunnerHandle::Get());
-    info.task_runner = base::ThreadTaskRunnerHandle::Get();
-    services->insert(std::make_pair(ash::mojom::kServiceName, info));
-  }
-#endif  // OS_CHROMEOS
+  g_browser_process->platform_part()->RegisterInProcessServices(services);
 }
 
 void ChromeContentBrowserClient::RegisterOutOfProcessServices(
diff --git a/chrome/browser/chrome_quota_permission_context.cc b/chrome/browser/chrome_quota_permission_context.cc
index b4921431..eb2bcd5 100644
--- a/chrome/browser/chrome_quota_permission_context.cc
+++ b/chrome/browser/chrome_quota_permission_context.cc
@@ -16,6 +16,7 @@
 #include "chrome/browser/permissions/permission_request_manager.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/tab_contents/tab_util.h"
+#include "chrome/browser/vr/vr_tab_helper.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/url_formatter/elide_url.h"
 #include "content/public/browser/browser_thread.h"
@@ -282,6 +283,14 @@
     return;
   }
 
+  if (vr::VrTabHelper::IsInVr(web_contents)) {
+    // Permission request UI cannot currently be rendered binocularly in VR
+    // mode, so we suppress the UI and return cancelled to inform the caller
+    // that the request will not progress. crbug.com/736568
+    DispatchCallbackOnIOThread(callback, QUOTA_PERMISSION_RESPONSE_CANCELLED);
+    return;
+  }
+
   if (PermissionRequestManager::IsEnabled()) {
     PermissionRequestManager* permission_request_manager =
         PermissionRequestManager::FromWebContents(web_contents);
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index b08ed14..2612ddb 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -1579,7 +1579,6 @@
   if (use_cups) {
     sources += [
       "printing/cups_print_job_manager_impl.cc",
-      "printing/cups_print_job_manager_impl.h",
       "printing/printer_info_cups.cc",
     ]
   } else {
diff --git a/chrome/browser/chromeos/options/network_config_view.cc b/chrome/browser/chromeos/options/network_config_view.cc
index a5fa099..c1d7c43 100644
--- a/chrome/browser/chromeos/options/network_config_view.cc
+++ b/chrome/browser/chromeos/options/network_config_view.cc
@@ -8,18 +8,12 @@
 
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/chromeos/login/ui/login_display_host.h"
 #include "chrome/browser/chromeos/options/network_property_ui_data.h"
 #include "chrome/browser/chromeos/options/vpn_config_view.h"
 #include "chrome/browser/chromeos/options/wifi_config_view.h"
 #include "chrome/browser/chromeos/options/wimax_config_view.h"
-#include "chrome/browser/profiles/profile_manager.h"
-#include "chrome/browser/ui/ash/ash_util.h"
 #include "chrome/browser/ui/ash/system_tray_client.h"
-#include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_dialogs.h"
-#include "chrome/browser/ui/browser_finder.h"
-#include "chrome/browser/ui/browser_window.h"
 #include "chrome/grit/generated_resources.h"
 #include "chrome/grit/locale_settings.h"
 #include "chromeos/login/login_state.h"
@@ -50,22 +44,6 @@
 // Used to check if a network config dialog is already showing.
 NetworkConfigView* g_instance = nullptr;
 
-gfx::NativeWindow GetParentForUnhostedDialog() {
-  if (LoginDisplayHost::default_host()) {
-    // TODO(jamescook): LoginDisplayHost has the wrong native window in mash.
-    // This will fix itself when mash converts from ui::Window to aura::Window.
-    // http://crbug.com/659155
-    if (!ash_util::IsRunningInMash())
-      return LoginDisplayHost::default_host()->GetNativeWindow();
-  } else {
-    Browser* browser = chrome::FindTabbedBrowser(
-        ProfileManager::GetPrimaryUserProfile(), true);
-    if (browser)
-      return browser->window()->GetNativeWindow();
-  }
-  return nullptr;
-}
-
 }  // namespace
 
 // static
@@ -116,17 +94,17 @@
 }
 
 // static
-void NetworkConfigView::ShowForNetworkId(const std::string& network_id,
-                                         gfx::NativeWindow parent) {
+NetworkConfigView* NetworkConfigView::ShowForNetworkId(
+    const std::string& network_id) {
   if (g_instance)
-    return;
+    return g_instance;
   const NetworkState* network =
       NetworkHandler::Get()->network_state_handler()->GetNetworkStateFromGuid(
           network_id);
   if (!network) {
     LOG(ERROR)
         << "NetworkConfigView::ShowForNetworkId called with invalid network";
-    return;
+    return nullptr;
   }
   NetworkConfigView* view = new NetworkConfigView();
   if (!view->InitWithNetworkState(network)) {
@@ -134,26 +112,27 @@
                   "network type: "
                << network->type();
     delete view;
-    return;
+    return nullptr;
   }
   NET_LOG(USER) << "NetworkConfigView::ShowForNetworkId: " << network->path();
-  view->ShowDialog(parent);
+  view->ShowDialog();
+  return view;
 }
 
 // static
-void NetworkConfigView::ShowForType(const std::string& type,
-                                    gfx::NativeWindow parent) {
+NetworkConfigView* NetworkConfigView::ShowForType(const std::string& type) {
   if (g_instance)
-    return;
+    return g_instance;
   NetworkConfigView* view = new NetworkConfigView();
   if (!view->InitWithType(type)) {
     LOG(ERROR) << "NetworkConfigView::ShowForType called with invalid type: "
                << type;
     delete view;
-    return;
+    return nullptr;
   }
   NET_LOG(USER) << "NetworkConfigView::ShowForType: " << type;
-  view->ShowDialog(parent);
+  view->ShowDialog();
+  return view;
 }
 
 gfx::NativeWindow NetworkConfigView::GetNativeWindow() const {
@@ -279,19 +258,8 @@
   }
 }
 
-void NetworkConfigView::ShowDialog(gfx::NativeWindow parent) {
-  // Attempt to find a fallback parent window.
-  if (parent == nullptr)
-    parent = GetParentForUnhostedDialog();
-
-  Widget* window = nullptr;
-  if (parent) {
-    // Create as a child of |parent|.
-    window = DialogDelegate::CreateDialogWidget(this, nullptr, parent);
-  } else {
-    // Fall back to default window container on primary display.
-    window = SystemTrayClient::CreateUnownedDialogWidget(this);
-  }
+void NetworkConfigView::ShowDialog() {
+  Widget* window = SystemTrayClient::CreateUnownedDialogWidget(this);
   window->SetAlwaysOnTop(true);
   window->Show();
 }
diff --git a/chrome/browser/chromeos/options/network_config_view.h b/chrome/browser/chromeos/options/network_config_view.h
index 39cd0981..e7539dd 100644
--- a/chrome/browser/chromeos/options/network_config_view.h
+++ b/chrome/browser/chromeos/options/network_config_view.h
@@ -7,7 +7,6 @@
 
 #include <string>
 
-#include "base/compiler_specific.h"
 #include "base/macros.h"
 #include "base/strings/string16.h"
 #include "ui/gfx/native_widget_types.h"  // gfx::NativeWindow
@@ -41,16 +40,13 @@
   };
 
   // Shows a network connection dialog if none is currently visible. The dialog
-  // will be a child of |parent| (e.g. the webui settings window) which ensures
-  // it appears on the display the user is looking at. If |parent| is null and
-  // no fallback parent can be found then the dialog will be placed on the
-  // primary display.
-  static void ShowForNetworkId(const std::string& network_id,
-                               gfx::NativeWindow parent);
+  // is placed on the default display for new windows. Returns the dialog or
+  // nullptr on error.
+  static NetworkConfigView* ShowForNetworkId(const std::string& network_id);
 
   // Shows a dialog to configure a new network. |type| must be a valid Shill
-  // 'Type' property value. See above regarding |parent|.
-  static void ShowForType(const std::string& type, gfx::NativeWindow parent);
+  // 'Type' property value. Returns the dialog or nullptr on error.
+  static NetworkConfigView* ShowForType(const std::string& type);
 
   // Returns corresponding native window.
   gfx::NativeWindow GetNativeWindow() const;
@@ -94,7 +90,7 @@
   bool InitWithType(const std::string& type);
 
   // Creates and shows a dialog containing this view.
-  void ShowDialog(gfx::NativeWindow parent);
+  void ShowDialog();
 
   // Resets the underlying view to show advanced options.
   void ShowAdvancedView();
diff --git a/chrome/browser/chromeos/options/network_config_view_browsertest.cc b/chrome/browser/chromeos/options/network_config_view_browsertest.cc
new file mode 100644
index 0000000..62fc53e3
--- /dev/null
+++ b/chrome/browser/chromeos/options/network_config_view_browsertest.cc
@@ -0,0 +1,50 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/options/network_config_view.h"
+
+#include "chrome/test/base/in_process_browser_test.h"
+#include "third_party/cros_system_api/dbus/shill/dbus-constants.h"
+
+namespace chromeos {
+namespace {
+
+using NetworkConfigViewTest = InProcessBrowserTest;
+
+IN_PROC_BROWSER_TEST_F(NetworkConfigViewTest, ShowForType) {
+  // An invalid network type does not create a dialog.
+  EXPECT_FALSE(NetworkConfigView::ShowForType("invalid"));
+
+  // Showing the dialog creates an always-on-top widget.
+  NetworkConfigView* view = NetworkConfigView::ShowForType(shill::kTypeWifi);
+  ASSERT_TRUE(view->GetWidget());
+  EXPECT_TRUE(view->GetWidget()->IsVisible());
+  EXPECT_TRUE(view->GetWidget()->IsAlwaysOnTop());
+
+  // Showing again returns the same dialog.
+  NetworkConfigView* repeat = NetworkConfigView::ShowForType(shill::kTypeWifi);
+  EXPECT_EQ(view, repeat);
+
+  view->GetWidget()->CloseNow();
+}
+
+IN_PROC_BROWSER_TEST_F(NetworkConfigViewTest, ShowForNetworkId) {
+  // An invalid network ID does not create a dialog.
+  EXPECT_FALSE(NetworkConfigView::ShowForNetworkId("invalid"));
+
+  // Showing the dialog creates an always-on-top widget.
+  NetworkConfigView* view = NetworkConfigView::ShowForNetworkId("wifi1_guid");
+  ASSERT_TRUE(view->GetWidget());
+  EXPECT_TRUE(view->GetWidget()->IsVisible());
+  EXPECT_TRUE(view->GetWidget()->IsAlwaysOnTop());
+
+  // Showing again returns the same dialog.
+  NetworkConfigView* repeat = NetworkConfigView::ShowForNetworkId("wifi1_guid");
+  EXPECT_EQ(view, repeat);
+
+  view->GetWidget()->CloseNow();
+}
+
+}  // namespace
+}  // namespace chromeos
diff --git a/chrome/browser/chromeos/printing/cups_print_job_manager_impl.cc b/chrome/browser/chromeos/printing/cups_print_job_manager_impl.cc
index 15df190..f6bcfc0 100644
--- a/chrome/browser/chromeos/printing/cups_print_job_manager_impl.cc
+++ b/chrome/browser/chromeos/printing/cups_print_job_manager_impl.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/printing/cups_print_job_manager_impl.h"
+#include "chrome/browser/chromeos/printing/cups_print_job_manager.h"
 
 #include <cups/cups.h>
 #include <algorithm>
@@ -208,304 +208,353 @@
 
 namespace chromeos {
 
-QueryResult::QueryResult() = default;
+struct QueryResult {
+  QueryResult() = default;
+  QueryResult(const QueryResult& other) = default;
+  ~QueryResult() = default;
 
-QueryResult::QueryResult(const QueryResult& other) = default;
+  bool success;
+  std::vector<::printing::QueueStatus> queues;
+};
 
-QueryResult::~QueryResult() = default;
-
-CupsWrapper::CupsWrapper()
-    : cups_connection_(GURL(), HTTP_ENCRYPT_NEVER, false) {
-  DETACH_FROM_SEQUENCE(sequence_checker_);
-}
-
-CupsWrapper::~CupsWrapper() = default;
-
-void CupsWrapper::QueryCups(const std::vector<std::string>& printer_ids,
-                            QueryResult* result) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  base::ThreadRestrictions::AssertIOAllowed();
-
-  result->success = cups_connection_.GetJobs(printer_ids, &result->queues);
-}
-
-void CupsWrapper::CancelJobImpl(const std::string& printer_id,
-                                const int job_id) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  base::ThreadRestrictions::AssertIOAllowed();
-
-  std::unique_ptr<::printing::CupsPrinter> printer =
-      cups_connection_.GetPrinter(printer_id);
-  if (!printer) {
-    LOG(WARNING) << "Printer not found: " << printer_id;
-    return;
+// A wrapper around the CUPS connection to ensure that it's always accessed on
+// the same sequence.
+class CupsWrapper {
+ public:
+  CupsWrapper() : cups_connection_(GURL(), HTTP_ENCRYPT_NEVER, false) {
+    DETACH_FROM_SEQUENCE(sequence_checker_);
   }
 
-  if (!printer->CancelJob(job_id)) {
-    // This is not expected to fail but log it if it does.
-    LOG(WARNING) << "Cancelling job failed.  Job may be stuck in queue.";
+  ~CupsWrapper() = default;
+
+  // Query CUPS for the current jobs for the given |printer_ids|.  Writes result
+  // to |result|.
+  void QueryCups(const std::vector<std::string>& printer_ids,
+                 QueryResult* result) {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+    base::ThreadRestrictions::AssertIOAllowed();
+
+    result->success = cups_connection_.GetJobs(printer_ids, &result->queues);
   }
-}
 
-CupsPrintJobManagerImpl::CupsPrintJobManagerImpl(Profile* profile)
-    : CupsPrintJobManager(profile),
-      query_runner_(base::CreateSequencedTaskRunnerWithTraits(
-          base::TaskTraits(base::TaskPriority::BACKGROUND,
-                           base::MayBlock(),
-                           base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN))),
-      cups_wrapper_(new CupsWrapper(),
-                    base::OnTaskRunnerDeleter(query_runner_)),
-      weak_ptr_factory_(this) {
-  registrar_.Add(this, chrome::NOTIFICATION_PRINT_JOB_EVENT,
-                 content::NotificationService::AllSources());
-}
+  // Cancel the print job on the blocking thread.
+  void CancelJobImpl(const std::string& printer_id, const int job_id) {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+    base::ThreadRestrictions::AssertIOAllowed();
 
-CupsPrintJobManagerImpl::~CupsPrintJobManagerImpl() {}
+    std::unique_ptr<::printing::CupsPrinter> printer =
+        cups_connection_.GetPrinter(printer_id);
+    if (!printer) {
+      LOG(WARNING) << "Printer not found: " << printer_id;
+      return;
+    }
 
-// Must be run from the UI thread.
-void CupsPrintJobManagerImpl::CancelPrintJob(CupsPrintJob* job) {
-  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-
-  // Copy job_id and printer_id.  |job| is about to be freed.
-  const int job_id = job->job_id();
-  const std::string printer_id = job->printer().id();
-
-  // Stop montioring jobs after we cancel them.  The user no longer cares.
-  jobs_.erase(job->GetUniqueId());
-
-  query_runner_->PostTask(
-      FROM_HERE,
-      base::Bind(&CupsWrapper::CancelJobImpl,
-                 base::Unretained(cups_wrapper_.get()), printer_id, job_id));
-}
-
-bool CupsPrintJobManagerImpl::SuspendPrintJob(CupsPrintJob* job) {
-  NOTREACHED() << "Pause printer is not implemented";
-  return false;
-}
-
-bool CupsPrintJobManagerImpl::ResumePrintJob(CupsPrintJob* job) {
-  NOTREACHED() << "Resume printer is not implemented";
-  return false;
-}
-
-void CupsPrintJobManagerImpl::Observe(
-    int type,
-    const content::NotificationSource& source,
-    const content::NotificationDetails& details) {
-  DCHECK_EQ(chrome::NOTIFICATION_PRINT_JOB_EVENT, type);
-
-  content::Details<::printing::JobEventDetails> job_details(details);
-
-  // DOC_DONE occurs after the print job has been successfully sent to the
-  // spooler which is when we begin tracking the print queue.
-  if (job_details->type() == ::printing::JobEventDetails::DOC_DONE) {
-    const ::printing::PrintedDocument* document = job_details->document();
-    DCHECK(document);
-    CreatePrintJob(base::UTF16ToUTF8(document->settings().device_name()),
-                   base::UTF16ToUTF8(document->settings().title()),
-                   job_details->job_id(), document->page_count());
+    if (!printer->CancelJob(job_id)) {
+      // This is not expected to fail but log it if it does.
+      LOG(WARNING) << "Cancelling job failed.  Job may be stuck in queue.";
+    }
   }
-}
 
-bool CupsPrintJobManagerImpl::CreatePrintJob(const std::string& printer_name,
-                                             const std::string& title,
-                                             int job_id,
-                                             int total_page_number) {
-  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+ private:
+  ::printing::CupsConnection cups_connection_;
+  SEQUENCE_CHECKER(sequence_checker_);
 
-  auto printer =
-      PrintersManagerFactory::GetForBrowserContext(profile_)->GetPrinter(
-          printer_name);
-  if (!printer) {
-    LOG(WARNING) << "Printer was removed while job was in progress.  It cannot "
-                    "be tracked";
+  DISALLOW_COPY_AND_ASSIGN(CupsWrapper);
+};
+
+class CupsPrintJobManagerImpl : public CupsPrintJobManager,
+                                public content::NotificationObserver {
+ public:
+  explicit CupsPrintJobManagerImpl(Profile* profile)
+      : CupsPrintJobManager(profile),
+        query_runner_(base::CreateSequencedTaskRunnerWithTraits(
+            base::TaskTraits(base::TaskPriority::BACKGROUND,
+                             base::MayBlock(),
+                             base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN))),
+        cups_wrapper_(new CupsWrapper(),
+                      base::OnTaskRunnerDeleter(query_runner_)),
+        weak_ptr_factory_(this) {
+    registrar_.Add(this, chrome::NOTIFICATION_PRINT_JOB_EVENT,
+                   content::NotificationService::AllSources());
+  }
+
+  ~CupsPrintJobManagerImpl() override = default;
+
+  // CupsPrintJobManager overrides:
+  // Must be run from the UI thread.
+  void CancelPrintJob(CupsPrintJob* job) override {
+    DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+
+    // Copy job_id and printer_id.  |job| is about to be freed.
+    const int job_id = job->job_id();
+    const std::string printer_id = job->printer().id();
+
+    // Stop montioring jobs after we cancel them.  The user no longer cares.
+    jobs_.erase(job->GetUniqueId());
+
+    query_runner_->PostTask(
+        FROM_HERE,
+        base::Bind(&CupsWrapper::CancelJobImpl,
+                   base::Unretained(cups_wrapper_.get()), printer_id, job_id));
+  }
+
+  bool SuspendPrintJob(CupsPrintJob* job) override {
+    NOTREACHED() << "Pause printer is not implemented";
     return false;
   }
 
-  // Records the number of jobs we're currently tracking when a new job is
-  // started.  This is equivalent to print queue size in the current
-  // implementation.
-  UMA_HISTOGRAM_EXACT_LINEAR("Printing.CUPS.PrintJobsQueued", jobs_.size(), 20);
-
-  // Create a new print job.
-  auto cpj = base::MakeUnique<CupsPrintJob>(*printer, job_id, title,
-                                            total_page_number);
-  std::string key = cpj->GetUniqueId();
-  jobs_[key] = std::move(cpj);
-
-  CupsPrintJob* job = jobs_[key].get();
-  NotifyJobCreated(job);
-
-  // Always start jobs in the waiting state.
-  job->set_state(CupsPrintJob::State::STATE_WAITING);
-  NotifyJobUpdated(job);
-
-  ScheduleQuery(base::TimeDelta());
-
-  return true;
-}
-
-void CupsPrintJobManagerImpl::ScheduleQuery() {
-  ScheduleQuery(base::TimeDelta::FromMilliseconds(kPollRate));
-}
-
-void CupsPrintJobManagerImpl::ScheduleQuery(const base::TimeDelta& delay) {
-  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-
-  if (!in_query_) {
-    in_query_ = true;
-
-    content::BrowserThread::PostDelayedTask(
-        content::BrowserThread::UI, FROM_HERE,
-        base::Bind(&CupsPrintJobManagerImpl::PostQuery,
-                   weak_ptr_factory_.GetWeakPtr()),
-        delay);
+  bool ResumePrintJob(CupsPrintJob* job) override {
+    NOTREACHED() << "Resume printer is not implemented";
+    return false;
   }
-}
 
-void CupsPrintJobManagerImpl::PostQuery() {
-  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+  // NotificationObserver overrides:
+  void Observe(int type,
+               const content::NotificationSource& source,
+               const content::NotificationDetails& details) override {
+    DCHECK_EQ(chrome::NOTIFICATION_PRINT_JOB_EVENT, type);
 
-  // The set of active printers is expected to be small.
-  std::set<std::string> printer_ids;
-  for (const auto& entry : jobs_) {
-    printer_ids.insert(entry.second->printer().id());
-  }
-  std::vector<std::string> ids{printer_ids.begin(), printer_ids.end()};
+    content::Details<::printing::JobEventDetails> job_details(details);
 
-  auto result = base::MakeUnique<QueryResult>();
-  QueryResult* result_ptr = result.get();
-  // Runs a query on |query_runner_| which will rejoin this sequnece on
-  // completion.
-  query_runner_->PostTaskAndReply(
-      FROM_HERE,
-      base::Bind(&CupsWrapper::QueryCups, base::Unretained(cups_wrapper_.get()),
-                 ids, result_ptr),
-      base::Bind(&CupsPrintJobManagerImpl::UpdateJobs,
-                 weak_ptr_factory_.GetWeakPtr(), base::Passed(&result)));
-}
-
-// Use job information to update local job states.  Previously completed jobs
-// could be in |jobs| but those are ignored as we will not emit updates for
-// them after they are completed.
-void CupsPrintJobManagerImpl::UpdateJobs(std::unique_ptr<QueryResult> result) {
-  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-
-  const std::vector<::printing::QueueStatus>& queues = result->queues;
-
-  // Query has completed.  Allow more queries.
-  in_query_ = false;
-
-  // If the query failed, either retry or purge.
-  if (!result->success) {
-    retry_count_++;
-    LOG(WARNING) << "Failed to query CUPS for queue status.  Schedule retry ("
-                 << retry_count_ << ")";
-    if (retry_count_ > kRetryMax) {
-      LOG(ERROR) << "CUPS is unreachable.  Giving up on all jobs.";
-      PurgeJobs();
-    } else {
-      // Schedule another query with a larger delay.
-      DCHECK_GE(1, retry_count_);
-      ScheduleQuery(
-          base::TimeDelta::FromMilliseconds(kPollRate * retry_count_));
+    // DOC_DONE occurs after the print job has been successfully sent to the
+    // spooler which is when we begin tracking the print queue.
+    if (job_details->type() == ::printing::JobEventDetails::DOC_DONE) {
+      const ::printing::PrintedDocument* document = job_details->document();
+      DCHECK(document);
+      CreatePrintJob(base::UTF16ToUTF8(document->settings().device_name()),
+                     base::UTF16ToUTF8(document->settings().title()),
+                     job_details->job_id(), document->page_count());
     }
-    return;
   }
 
-  // A query has completed.  Reset retry counter.
-  retry_count_ = 0;
+ private:
+  // Begin monitoring a print job for a given |printer_name| with the given
+  // |title| with the pages |total_page_number|.
+  bool CreatePrintJob(const std::string& printer_name,
+                      const std::string& title,
+                      int job_id,
+                      int total_page_number) {
+    DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
-  std::vector<std::string> active_jobs;
-  for (const auto& queue : queues) {
-    for (auto& job : queue.jobs) {
-      std::string key = CupsPrintJob::GetUniqueId(job.printer_id, job.id);
-      const auto& entry = jobs_.find(key);
-      if (entry == jobs_.end())
-        continue;
+    auto printer =
+        PrintersManagerFactory::GetForBrowserContext(profile_)->GetPrinter(
+            printer_name);
+    if (!printer) {
+      LOG(WARNING)
+          << "Printer was removed while job was in progress.  It cannot "
+             "be tracked";
+      return false;
+    }
 
-      CupsPrintJob* print_job = entry->second.get();
+    // Records the number of jobs we're currently tracking when a new job is
+    // started.  This is equivalent to print queue size in the current
+    // implementation.
+    UMA_HISTOGRAM_EXACT_LINEAR("Printing.CUPS.PrintJobsQueued", jobs_.size(),
+                               20);
 
-      if (UpdatePrintJob(queue.printer_status, job, print_job)) {
-        // The state of the job changed, notify observers.
-        NotifyJobStateUpdate(print_job);
-      }
+    // Create a new print job.
+    auto cpj = base::MakeUnique<CupsPrintJob>(*printer, job_id, title,
+                                              total_page_number);
+    std::string key = cpj->GetUniqueId();
+    jobs_[key] = std::move(cpj);
 
-      if (print_job->expired()) {
-        // Job needs to be forcibly cancelled.
-        RecordJobResult(TIMEOUT_CANCEL);
-        CancelPrintJob(print_job);
-        // Beware, print_job was removed from jobs_ and deleted.
-      } else if (print_job->IsJobFinished()) {
-        // Cleanup completed jobs.
-        RecordJobResult(ResultForHistogram(print_job->state()));
-        jobs_.erase(entry);
+    CupsPrintJob* job = jobs_[key].get();
+    NotifyJobCreated(job);
+
+    // Always start jobs in the waiting state.
+    job->set_state(CupsPrintJob::State::STATE_WAITING);
+    NotifyJobUpdated(job);
+
+    ScheduleQuery(base::TimeDelta());
+
+    return true;
+  }
+
+  // Schedule a query of CUPS for print job status with the default delay.
+  void ScheduleQuery() {
+    ScheduleQuery(base::TimeDelta::FromMilliseconds(kPollRate));
+  }
+
+  // Schedule a query of CUPS for print job status with a delay of |delay|.
+  void ScheduleQuery(const base::TimeDelta& delay) {
+    DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+
+    if (!in_query_) {
+      in_query_ = true;
+
+      content::BrowserThread::PostDelayedTask(
+          content::BrowserThread::UI, FROM_HERE,
+          base::Bind(&CupsPrintJobManagerImpl::PostQuery,
+                     weak_ptr_factory_.GetWeakPtr()),
+          delay);
+    }
+  }
+
+  // Schedule the CUPS query off the UI thread. Posts results back to UI thread
+  // to UpdateJobs.
+  void PostQuery() {
+    DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+
+    // The set of active printers is expected to be small.
+    std::set<std::string> printer_ids;
+    for (const auto& entry : jobs_) {
+      printer_ids.insert(entry.second->printer().id());
+    }
+    std::vector<std::string> ids{printer_ids.begin(), printer_ids.end()};
+
+    auto result = base::MakeUnique<QueryResult>();
+    QueryResult* result_ptr = result.get();
+    // Runs a query on |query_runner_| which will rejoin this sequnece on
+    // completion.
+    query_runner_->PostTaskAndReply(
+        FROM_HERE,
+        base::Bind(&CupsWrapper::QueryCups,
+                   base::Unretained(cups_wrapper_.get()), ids, result_ptr),
+        base::Bind(&CupsPrintJobManagerImpl::UpdateJobs,
+                   weak_ptr_factory_.GetWeakPtr(), base::Passed(&result)));
+  }
+
+  // Process jobs from CUPS and perform notifications.
+  // Use job information to update local job states.  Previously completed jobs
+  // could be in |jobs| but those are ignored as we will not emit updates for
+  // them after they are completed.
+  void UpdateJobs(std::unique_ptr<QueryResult> result) {
+    DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+
+    const std::vector<::printing::QueueStatus>& queues = result->queues;
+
+    // Query has completed.  Allow more queries.
+    in_query_ = false;
+
+    // If the query failed, either retry or purge.
+    if (!result->success) {
+      retry_count_++;
+      LOG(WARNING) << "Failed to query CUPS for queue status.  Schedule retry ("
+                   << retry_count_ << ")";
+      if (retry_count_ > kRetryMax) {
+        LOG(ERROR) << "CUPS is unreachable.  Giving up on all jobs.";
+        PurgeJobs();
       } else {
-        active_jobs.push_back(key);
+        // Schedule another query with a larger delay.
+        DCHECK_GE(1, retry_count_);
+        ScheduleQuery(
+            base::TimeDelta::FromMilliseconds(kPollRate * retry_count_));
       }
+      return;
+    }
+
+    // A query has completed.  Reset retry counter.
+    retry_count_ = 0;
+
+    std::vector<std::string> active_jobs;
+    for (const auto& queue : queues) {
+      for (auto& job : queue.jobs) {
+        std::string key = CupsPrintJob::GetUniqueId(job.printer_id, job.id);
+        const auto& entry = jobs_.find(key);
+        if (entry == jobs_.end())
+          continue;
+
+        CupsPrintJob* print_job = entry->second.get();
+
+        if (UpdatePrintJob(queue.printer_status, job, print_job)) {
+          // The state of the job changed, notify observers.
+          NotifyJobStateUpdate(print_job);
+        }
+
+        if (print_job->expired()) {
+          // Job needs to be forcibly cancelled.
+          RecordJobResult(TIMEOUT_CANCEL);
+          CancelPrintJob(print_job);
+          // Beware, print_job was removed from jobs_ and deleted.
+        } else if (print_job->IsJobFinished()) {
+          // Cleanup completed jobs.
+          RecordJobResult(ResultForHistogram(print_job->state()));
+          jobs_.erase(entry);
+        } else {
+          active_jobs.push_back(key);
+        }
+      }
+    }
+
+    // Keep polling until all jobs complete or error.
+    if (!active_jobs.empty()) {
+      // During normal operations, we poll at the default rate.
+      ScheduleQuery();
+    } else if (!jobs_.empty()) {
+      // We're tracking jobs that we didn't receive an update for.  Something
+      // bad has happened.
+      LOG(ERROR) << "Lost track of (" << jobs_.size() << ") jobs";
+      PurgeJobs();
     }
   }
 
-  // Keep polling until all jobs complete or error.
-  if (!active_jobs.empty()) {
-    // During normal operations, we poll at the default rate.
-    ScheduleQuery();
-  } else if (!jobs_.empty()) {
-    // We're tracking jobs that we didn't receive an update for.  Something
-    // bad has happened.
-    LOG(ERROR) << "Lost track of (" << jobs_.size() << ") jobs";
-    PurgeJobs();
-  }
-}
+  // Mark remaining jobs as errors and remove active jobs.
+  void PurgeJobs() {
+    DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
-void CupsPrintJobManagerImpl::PurgeJobs() {
-  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+    for (const auto& entry : jobs_) {
+      // Declare all lost jobs errors.
+      RecordJobResult(LOST);
+      CupsPrintJob* job = entry.second.get();
+      job->set_state(CupsPrintJob::State::STATE_ERROR);
+      NotifyJobStateUpdate(job);
+    }
 
-  for (const auto& entry : jobs_) {
-    // Declare all lost jobs errors.
-    RecordJobResult(LOST);
-    CupsPrintJob* job = entry.second.get();
-    job->set_state(CupsPrintJob::State::STATE_ERROR);
-    NotifyJobStateUpdate(job);
+    jobs_.clear();
   }
 
-  jobs_.clear();
-}
+  // Notify observers that a state update has occured for |job|.
+  void NotifyJobStateUpdate(CupsPrintJob* job) {
+    DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
-void CupsPrintJobManagerImpl::NotifyJobStateUpdate(CupsPrintJob* job) {
-  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-
-  switch (job->state()) {
-    case State::STATE_NONE:
-      // State does not require notification.
-      break;
-    case State::STATE_WAITING:
-      NotifyJobUpdated(job);
-      break;
-    case State::STATE_STARTED:
-      NotifyJobStarted(job);
-      break;
-    case State::STATE_PAGE_DONE:
-      NotifyJobUpdated(job);
-      break;
-    case State::STATE_RESUMED:
-      NotifyJobResumed(job);
-      break;
-    case State::STATE_SUSPENDED:
-      NotifyJobSuspended(job);
-      break;
-    case State::STATE_CANCELLED:
-      NotifyJobCanceled(job);
-      break;
-    case State::STATE_ERROR:
-      NotifyJobError(job);
-      break;
-    case State::STATE_DOCUMENT_DONE:
-      NotifyJobDone(job);
-      break;
+    switch (job->state()) {
+      case State::STATE_NONE:
+        // State does not require notification.
+        break;
+      case State::STATE_WAITING:
+        NotifyJobUpdated(job);
+        break;
+      case State::STATE_STARTED:
+        NotifyJobStarted(job);
+        break;
+      case State::STATE_PAGE_DONE:
+        NotifyJobUpdated(job);
+        break;
+      case State::STATE_RESUMED:
+        NotifyJobResumed(job);
+        break;
+      case State::STATE_SUSPENDED:
+        NotifyJobSuspended(job);
+        break;
+      case State::STATE_CANCELLED:
+        NotifyJobCanceled(job);
+        break;
+      case State::STATE_ERROR:
+        NotifyJobError(job);
+        break;
+      case State::STATE_DOCUMENT_DONE:
+        NotifyJobDone(job);
+        break;
+    }
   }
-}
+
+  // Ongoing print jobs.
+  std::map<std::string, std::unique_ptr<CupsPrintJob>> jobs_;
+
+  // Prevents multiple queries from being scheduled simultaneously.
+  bool in_query_ = false;
+
+  // Records the number of consecutive times the GetJobs query has failed.
+  int retry_count_ = 0;
+
+  content::NotificationRegistrar registrar_;
+  // Task runner for queries to CUPS.
+  scoped_refptr<base::SequencedTaskRunner> query_runner_;
+  std::unique_ptr<CupsWrapper, base::OnTaskRunnerDeleter> cups_wrapper_;
+  base::WeakPtrFactory<CupsPrintJobManagerImpl> weak_ptr_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(CupsPrintJobManagerImpl);
+};
 
 // static
 CupsPrintJobManager* CupsPrintJobManager::CreateInstance(Profile* profile) {
diff --git a/chrome/browser/chromeos/printing/cups_print_job_manager_impl.h b/chrome/browser/chromeos/printing/cups_print_job_manager_impl.h
deleted file mode 100644
index 804ddb1..0000000
--- a/chrome/browser/chromeos/printing/cups_print_job_manager_impl.h
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_CHROMEOS_PRINTING_CUPS_PRINT_JOB_MANAGER_IMPL_H_
-#define CHROME_BROWSER_CHROMEOS_PRINTING_CUPS_PRINT_JOB_MANAGER_IMPL_H_
-
-#include <map>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/memory/ref_counted.h"
-#include "base/memory/weak_ptr.h"
-#include "base/sequence_checker.h"
-#include "base/sequenced_task_runner.h"
-#include "chrome/browser/chromeos/printing/cups_print_job.h"
-#include "chrome/browser/chromeos/printing/cups_print_job_manager.h"
-#include "chrome/browser/chromeos/printing/printers_manager.h"
-#include "content/public/browser/notification_observer.h"
-#include "content/public/browser/notification_registrar.h"
-#include "printing/backend/cups_connection.h"
-
-class Profile;
-
-namespace chromeos {
-
-struct QueryResult {
-  QueryResult();
-  QueryResult(const QueryResult& other);
-  ~QueryResult();
-
-  bool success;
-  std::vector<::printing::QueueStatus> queues;
-};
-
-// A wrapper around the CUPS connection to ensure that it's always accessed on
-// the same sequence.
-class CupsWrapper {
- public:
-  CupsWrapper();
-  ~CupsWrapper();
-
-  // Query CUPS for the current jobs for the given |printer_ids|.  Writes result
-  // to |result|.
-  void QueryCups(const std::vector<std::string>& printer_ids,
-                 QueryResult* result);
-
-  // Cancel the print job on the blocking thread.
-  void CancelJobImpl(const std::string& printer_id, const int job_id);
-
- private:
-  ::printing::CupsConnection cups_connection_;
-  SEQUENCE_CHECKER(sequence_checker_);
-
-  DISALLOW_COPY_AND_ASSIGN(CupsWrapper);
-};
-
-class CupsPrintJobManagerImpl : public CupsPrintJobManager,
-                                public content::NotificationObserver {
- public:
-  explicit CupsPrintJobManagerImpl(Profile* profile);
-  ~CupsPrintJobManagerImpl() override;
-
-  // CupsPrintJobManager overrides:
-  void CancelPrintJob(CupsPrintJob* job) override;
-  bool SuspendPrintJob(CupsPrintJob* job) override;
-  bool ResumePrintJob(CupsPrintJob* job) override;
-
-  // NotificationObserver overrides:
-  void Observe(int type,
-               const content::NotificationSource& source,
-               const content::NotificationDetails& details) override;
-
- private:
-  // Begin monitoring a print job for a given |printer_name| with the given
-  // |title| with the pages |total_page_number|.
-  bool CreatePrintJob(const std::string& printer_name,
-                      const std::string& title,
-                      int job_id,
-                      int total_page_number);
-
-  // Schedule a query of CUPS for print job status with the default delay.
-  void ScheduleQuery();
-  // Schedule a query of CUPS for print job status with a delay of |delay|.
-  void ScheduleQuery(const base::TimeDelta& delay);
-
-  // Schedule the CUPS query off the UI thread. Posts results back to UI thread
-  // to UpdateJobs.
-  void PostQuery();
-
-  // Process jobs from CUPS and perform notifications.
-  void UpdateJobs(std::unique_ptr<QueryResult> results);
-
-  // Mark remaining jobs as errors and remove active jobs.
-  void PurgeJobs();
-
-  // Notify observers that a state update has occured for |job|.
-  void NotifyJobStateUpdate(CupsPrintJob* job);
-
-  // Ongoing print jobs.
-  std::map<std::string, std::unique_ptr<CupsPrintJob>> jobs_;
-
-  // Prevents multiple queries from being scheduled simultaneously.
-  bool in_query_ = false;
-
-  // Records the number of consecutive times the GetJobs query has failed.
-  int retry_count_ = 0;
-
-  content::NotificationRegistrar registrar_;
-  // Task runner for queries to CUPS.
-  scoped_refptr<base::SequencedTaskRunner> query_runner_;
-  std::unique_ptr<CupsWrapper, base::OnTaskRunnerDeleter> cups_wrapper_;
-  base::WeakPtrFactory<CupsPrintJobManagerImpl> weak_ptr_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(CupsPrintJobManagerImpl);
-};
-
-}  // namespace chromeos
-
-#endif  // CHROME_BROWSER_CHROMEOS_PRINTING_CUPS_PRINT_JOB_MANAGER_IMPL_H_
diff --git a/chrome/browser/chromeos/printing/printer_discoverer.cc b/chrome/browser/chromeos/printing/printer_discoverer.cc
deleted file mode 100644
index 82f0fbf..0000000
--- a/chrome/browser/chromeos/printing/printer_discoverer.cc
+++ /dev/null
@@ -1,120 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/chromeos/printing/printer_discoverer.h"
-
-#include "base/bind.h"
-#include "base/memory/ptr_util.h"
-#include "base/memory/weak_ptr.h"
-#include "base/observer_list.h"
-#include "base/scoped_observer.h"
-#include "base/threading/sequenced_task_runner_handle.h"
-#include "chrome/browser/chromeos/printing/printers_manager.h"
-#include "chrome/browser/chromeos/printing/printers_manager_factory.h"
-#include "chrome/browser/chromeos/printing/usb_printer_detector.h"
-#include "chrome/browser/chromeos/printing/usb_printer_detector_factory.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chromeos/printing/printer_configuration.h"
-
-namespace chromeos {
-namespace {
-
-// Implementation of PrinterDiscoverer interface.
-class PrinterDiscovererImpl : public PrinterDiscoverer,
-                              public UsbPrinterDetector::Observer {
- public:
-  explicit PrinterDiscovererImpl(Profile* profile)
-      : detector_observer_(this), profile_(profile), weak_ptr_factory_(this) {
-    UsbPrinterDetector* usb_detector =
-        UsbPrinterDetectorFactory::GetInstance()->Get(profile);
-    DCHECK(usb_detector);
-    detector_observer_.Add(usb_detector);
-    usb_printers_ = usb_detector->GetPrinters();
-  }
-  ~PrinterDiscovererImpl() override = default;
-
-  // PrinterDiscoverer interface function.
-  void AddObserver(PrinterDiscoverer::Observer* observer) override {
-    observer_list_.AddObserver(observer);
-    // WrappedOnPrintersFound is a simple wrapper around
-    // Observer::OnPrintersFound which lets us safely do the initial
-    // OnPrintersFound call to the registered observer.  This wrapper buys us
-    // weak_ptr semantics on 'this', and also guards against removal of the
-    // observer from the Discoverer before this callback is issued.
-    base::SequencedTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE, base::Bind(&PrinterDiscovererImpl::WrappedOnPrintersFound,
-                              weak_ptr_factory_.GetWeakPtr(), observer,
-                              GetAvailablePrinters()));
-  }
-
-  // PrinterDiscoverer interface function.
-  void RemoveObserver(PrinterDiscoverer::Observer* observer) override {
-    observer_list_.RemoveObserver(observer);
-  }
-
-  // PrinterDetector::Observer interface function.
-  void OnAvailableUsbPrintersChanged(
-      const std::vector<Printer>& printers) override {
-    usb_printers_ = printers;
-    std::vector<Printer> all_printers = GetAvailablePrinters();
-    for (PrinterDiscoverer::Observer& observer : observer_list_) {
-      observer.OnPrintersFound(all_printers);
-    }
-  }
-
- private:
-  // Wrapper for doing the initial OnPrintersFound call on an observer of this
-  // object.
-  void WrappedOnPrintersFound(PrinterDiscoverer::Observer* observer,
-                              const std::vector<Printer>& printers) {
-    if (observer_list_.HasObserver(observer)) {
-      observer->OnPrintersFound(printers);
-      // Since USB is the only thing we're worried about at the moment, and we
-      // don't have to wait for those printers to be scanned, we can just tell
-      // the observer the initial scan is done now.  This will change when we're
-      // also doing network discovery -- we'll hold off on issuing this callback
-      // until the network discovery is done as well.
-      observer->OnDiscoveryInitialScanDone(printers.size());
-    }
-  }
-
-  // Get the current set of discovered printers that are not already known
-  // to the user's PrintersManager.
-  std::vector<Printer> GetAvailablePrinters() {
-    // Only know about usb printers for now.  Eventually we'll add discovered
-    // network printers as well.
-    std::vector<Printer> ret;
-    PrintersManager* printers_manager =
-        PrintersManagerFactory::GetForBrowserContext(profile_);
-    if (!printers_manager) {
-      LOG(WARNING) << "Failing to get available printers because no "
-                      "PrintersManager exists.";
-      return ret;
-    }
-
-    for (const Printer& printer : usb_printers_) {
-      if (printers_manager->GetPrinter(printer.id()).get() == nullptr) {
-        ret.push_back(printer);
-      }
-    }
-    return ret;
-  }
-
-  std::vector<Printer> usb_printers_;
-  base::ObserverList<PrinterDiscoverer::Observer> observer_list_;
-  ScopedObserver<UsbPrinterDetector, UsbPrinterDetector::Observer>
-      detector_observer_;
-  Profile* profile_;
-  base::WeakPtrFactory<PrinterDiscovererImpl> weak_ptr_factory_;
-};
-
-}  // namespace
-
-// static
-std::unique_ptr<PrinterDiscoverer> PrinterDiscoverer::CreateForProfile(
-    Profile* profile) {
-  return base::MakeUnique<PrinterDiscovererImpl>(profile);
-}
-
-}  // namespace chromeos
diff --git a/chrome/browser/chromeos/printing/printer_discoverer.h b/chrome/browser/chromeos/printing/printer_discoverer.h
deleted file mode 100644
index d49720c..0000000
--- a/chrome/browser/chromeos/printing/printer_discoverer.h
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_CHROMEOS_PRINTING_PRINTER_DISCOVERER_H_
-#define CHROME_BROWSER_CHROMEOS_PRINTING_PRINTER_DISCOVERER_H_
-
-#include <memory>
-#include <vector>
-
-#include "chromeos/printing/printer_configuration.h"
-
-class Profile;
-
-namespace chromeos {
-
-// Interface for printer discovery.  Constructs Printer objects from USB and
-// zeroconf (DNS-SD) printers.  All functions in this class must be called
-// from a sequenced context.
-class CHROMEOS_EXPORT PrinterDiscoverer {
- public:
-  // Interface for objects interested in detected printers.
-  class Observer {
-   public:
-    virtual ~Observer() = default;
-
-    // Called when we are done with the initial scan for printers.  We may
-    // still call OnPrintersFound if the set of available printers
-    // changes, but the user can conclude that if a printer is currently
-    // available and not in the list, we're not still looking for it.
-    // TODO(justincarlson): Merge with OnPrintersFound when crbug.com/588234 is
-    // complete.
-    virtual void OnDiscoveryInitialScanDone(int printer_count) = 0;
-
-    // Called with a collection of printers as they are discovered.  On each
-    // call |printers| is the full set of known printers; it is not
-    // incremental; printers may be added or removed.
-    //
-    // Observers will get an OnPrintersFound callback after registration
-    // with the existing list of printers (which may be empty) and will get
-    // additional calls whenever the set of printers changes.
-    virtual void OnPrintersFound(const std::vector<Printer>& printers) = 0;
-  };
-
-  // Static factory
-  static std::unique_ptr<PrinterDiscoverer> CreateForProfile(Profile* profile);
-
-  virtual ~PrinterDiscoverer() = default;
-
-  // Add an observer that will be notified of discovered printers.  Ownership of
-  // |observer| is not taken by the discoverer.  It is an error to add an
-  // observer more than once.  Calls to |observer| methods will take place on
-  // the thread PrinterDiscoverer was instantiated on.
-  virtual void AddObserver(PrinterDiscoverer::Observer* observer) = 0;
-
-  // Remove an observer of printer discovery.
-  virtual void RemoveObserver(PrinterDiscoverer::Observer* observer) = 0;
-};
-
-}  // namespace chromeos
-
-#endif  // CHROME_BROWSER_CHROMEOS_PRINTING_PRINTER_DISCOVERER_H_
diff --git a/chrome/browser/chromeos/status/network_menu.cc b/chrome/browser/chromeos/status/network_menu.cc
index 530ba8af..555615c 100644
--- a/chrome/browser/chromeos/status/network_menu.cc
+++ b/chrome/browser/chromeos/status/network_menu.cc
@@ -338,11 +338,13 @@
 // NetworkMenuModel, private methods:
 
 void NetworkMenuModel::ShowOther(const std::string& type) const {
-  gfx::NativeWindow native_window = owner_->delegate()->GetNativeWindow();
-  if (type == shill::kTypeCellular)
-    ChooseMobileNetworkDialog::ShowDialog(native_window);
-  else
-    NetworkConfigView::ShowForType(shill::kTypeWifi, native_window);
+  if (type == shill::kTypeCellular) {
+    // TODO(jamescook): This should not need a parent.
+    ChooseMobileNetworkDialog::ShowDialog(
+        owner_->delegate()->GetNativeWindow());
+  } else {
+    NetworkConfigView::ShowForType(shill::kTypeWifi);
+  }
 }
 
 ////////////////////////////////////////////////////////////////////////////////
diff --git a/chrome/browser/chromeos/ui/choose_mobile_network_dialog.h b/chrome/browser/chromeos/ui/choose_mobile_network_dialog.h
index 3808d37..72019843 100644
--- a/chrome/browser/chromeos/ui/choose_mobile_network_dialog.h
+++ b/chrome/browser/chromeos/ui/choose_mobile_network_dialog.h
@@ -16,6 +16,8 @@
  public:
   // Shows the dialog box. The dialog is created as a child of |parent|. If the
   // |parent| is null the dialog is created in the default modal container.
+  // TODO(jamescook): This should not need a |parent|. See similar methods in
+  // NetworkConfigView.
   static void ShowDialog(gfx::NativeWindow parent);
 
   // Shows the dialog in an ash window container (which must be a system modal
diff --git a/chrome/browser/conflicts/enumerate_input_method_editors_win.cc b/chrome/browser/conflicts/enumerate_input_method_editors_win.cc
index e4952f8..a6d2345 100644
--- a/chrome/browser/conflicts/enumerate_input_method_editors_win.cc
+++ b/chrome/browser/conflicts/enumerate_input_method_editors_win.cc
@@ -74,7 +74,7 @@
 
 void EnumerateImesOnBlockingSequence(
     scoped_refptr<base::SequencedTaskRunner> task_runner,
-    OnImeEnumeratedCallback callback) {
+    OnImeEnumeratedCallback on_ime_enumerated) {
   int nb_imes = 0;
   for (base::win::RegistryKeyIterator iter(HKEY_LOCAL_MACHINE, kImeRegistryKey);
        iter.Valid(); ++iter) {
@@ -97,8 +97,8 @@
 
     nb_imes++;
     task_runner->PostTask(FROM_HERE,
-                          base::BindRepeating(callback, dll_path, size_of_image,
-                                              time_date_stamp));
+                          base::BindRepeating(on_ime_enumerated, dll_path,
+                                              size_of_image, time_date_stamp));
   }
 
   base::UmaHistogramCounts100("ThirdPartyModules.InputMethodEditorsCount",
@@ -108,14 +108,13 @@
 }  // namespace
 
 const wchar_t kImeRegistryKey[] = L"SOFTWARE\\Microsoft\\CTF\\TIP";
-const wchar_t kClassIdRegistryKeyFormat[] = L"CLSID\\%ls\\InProcServer32";
 
-void EnumerateInputMethodEditors(OnImeEnumeratedCallback callback) {
+void EnumerateInputMethodEditors(OnImeEnumeratedCallback on_ime_enumerated) {
   base::PostTaskWithTraits(
       FROM_HERE,
       {base::MayBlock(), base::TaskPriority::BACKGROUND,
        base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN},
       base::BindOnce(&EnumerateImesOnBlockingSequence,
                      base::SequencedTaskRunnerHandle::Get(),
-                     std::move(callback)));
+                     std::move(on_ime_enumerated)));
 }
diff --git a/chrome/browser/conflicts/enumerate_input_method_editors_win.h b/chrome/browser/conflicts/enumerate_input_method_editors_win.h
index b1426dc..7f400c563 100644
--- a/chrome/browser/conflicts/enumerate_input_method_editors_win.h
+++ b/chrome/browser/conflicts/enumerate_input_method_editors_win.h
@@ -16,10 +16,6 @@
 // The path to the registry key where IMEs are registered.
 extern const wchar_t kImeRegistryKey[];
 
-// A format string for generating paths to COM class in-proc server keys under
-// HKEY_CLASSES_ROOT.
-extern const wchar_t kClassIdRegistryKeyFormat[];
-
 // Finds third-party IMEs (Input Method Editor) installed on the computer by
 // enumerating the registry. In addition to the file path, the SizeOfImage and
 // TimeDateStamp of the module is returned via the callback.
diff --git a/chrome/browser/conflicts/enumerate_input_method_editors_win_unittest.cc b/chrome/browser/conflicts/enumerate_input_method_editors_win_unittest.cc
index 69030dc..38c5604 100644
--- a/chrome/browser/conflicts/enumerate_input_method_editors_win_unittest.cc
+++ b/chrome/browser/conflicts/enumerate_input_method_editors_win_unittest.cc
@@ -13,6 +13,7 @@
 #include "base/strings/stringprintf.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/test/test_reg_util_win.h"
+#include "chrome/browser/conflicts/module_info_util_win.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace {
@@ -68,7 +69,7 @@
 }  // namespace
 
 // Registers a few fake IMEs then see if the enumeration finds them.
-TEST_F(EnumerateInputMethodEditorsTest, EnumerateImes2) {
+TEST_F(EnumerateInputMethodEditorsTest, EnumerateImes) {
   // Use the current exe file as an arbitrary module that exists.
   base::FilePath file_exe;
   ASSERT_TRUE(base::PathService::Get(base::FILE_EXE, &file_exe));
diff --git a/chrome/browser/conflicts/enumerate_shell_extensions_win.cc b/chrome/browser/conflicts/enumerate_shell_extensions_win.cc
new file mode 100644
index 0000000..795cbc7
--- /dev/null
+++ b/chrome/browser/conflicts/enumerate_shell_extensions_win.cc
@@ -0,0 +1,97 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/conflicts/enumerate_shell_extensions_win.h"
+
+#include <utility>
+
+#include "base/files/file_path.h"
+#include "base/memory/ref_counted.h"
+#include "base/metrics/histogram_functions.h"
+#include "base/sequenced_task_runner.h"
+#include "base/strings/string16.h"
+#include "base/strings/stringprintf.h"
+#include "base/task_scheduler/post_task.h"
+#include "base/task_scheduler/task_traits.h"
+#include "base/threading/sequenced_task_runner_handle.h"
+#include "base/threading/thread_restrictions.h"
+#include "base/win/registry.h"
+#include "chrome/browser/conflicts/module_info_util_win.h"
+
+namespace {
+
+void ReadShellExtensions(
+    HKEY parent,
+    const base::Callback<void(const base::FilePath&)>& callback,
+    int* nb_shell_extensions) {
+  for (base::win::RegistryValueIterator iter(parent,
+                                             kShellExtensionRegistryKey);
+       iter.Valid(); ++iter) {
+    base::string16 key =
+        base::StringPrintf(kClassIdRegistryKeyFormat, iter.Name());
+
+    base::win::RegKey clsid;
+    if (clsid.Open(HKEY_CLASSES_ROOT, key.c_str(), KEY_READ) != ERROR_SUCCESS)
+      continue;
+
+    base::string16 dll;
+    if (clsid.ReadValue(L"", &dll) != ERROR_SUCCESS)
+      continue;
+
+    nb_shell_extensions++;
+    callback.Run(base::FilePath(dll));
+  }
+}
+
+void OnShellExtensionPathEnumerated(
+    scoped_refptr<base::SequencedTaskRunner> task_runner,
+    OnShellExtensionEnumeratedCallback on_shell_extension_enumerated,
+    const base::FilePath& path) {
+  uint32_t size_of_image = 0;
+  uint32_t time_date_stamp = 0;
+  if (!GetModuleImageSizeAndTimeDateStamp(path, &size_of_image,
+                                          &time_date_stamp)) {
+    return;
+  }
+
+  task_runner->PostTask(
+      FROM_HERE, base::BindRepeating(std::move(on_shell_extension_enumerated),
+                                     path, size_of_image, time_date_stamp));
+}
+
+void EnumerateShellExtensionsOnBlockingSequence(
+    scoped_refptr<base::SequencedTaskRunner> task_runner,
+    OnShellExtensionEnumeratedCallback on_shell_extension_enumerated) {
+  EnumerateShellExtensionPaths(base::BindRepeating(
+      &OnShellExtensionPathEnumerated, std::move(task_runner),
+      std::move(on_shell_extension_enumerated)));
+}
+
+}  // namespace
+
+const wchar_t kShellExtensionRegistryKey[] =
+    L"Software\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Approved";
+
+void EnumerateShellExtensionPaths(
+    const base::Callback<void(const base::FilePath&)>& callback) {
+  base::ThreadRestrictions::AssertIOAllowed();
+
+  int nb_shell_extensions = 0;
+  ReadShellExtensions(HKEY_LOCAL_MACHINE, callback, &nb_shell_extensions);
+  ReadShellExtensions(HKEY_CURRENT_USER, callback, &nb_shell_extensions);
+
+  base::UmaHistogramCounts100("ThirdPartyModules.ShellExtensionsCount",
+                              nb_shell_extensions);
+}
+
+void EnumerateShellExtensions(
+    OnShellExtensionEnumeratedCallback on_shell_extension_enumerated) {
+  base::PostTaskWithTraits(
+      FROM_HERE,
+      {base::MayBlock(), base::TaskPriority::BACKGROUND,
+       base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN},
+      base::BindOnce(&EnumerateShellExtensionsOnBlockingSequence,
+                     base::SequencedTaskRunnerHandle::Get(),
+                     std::move(on_shell_extension_enumerated)));
+}
diff --git a/chrome/browser/conflicts/enumerate_shell_extensions_win.h b/chrome/browser/conflicts/enumerate_shell_extensions_win.h
new file mode 100644
index 0000000..de74ef1
--- /dev/null
+++ b/chrome/browser/conflicts/enumerate_shell_extensions_win.h
@@ -0,0 +1,34 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_CONFLICTS_ENUMERATE_SHELL_EXTENSIONS_WIN_H_
+#define CHROME_BROWSER_CONFLICTS_ENUMERATE_SHELL_EXTENSIONS_WIN_H_
+
+#include <stdint.h>
+
+#include "base/callback_forward.h"
+
+namespace base {
+class FilePath;
+}
+
+// The path to the registry key where shell extensions are registered.
+extern const wchar_t kShellExtensionRegistryKey[];
+
+// Enumerates registered shell extensions, and invokes |callback| once per shell
+// extension found. Must be called on a blocking sequence.
+// TODO(pmonette): Move this implementation detail to the .cc file when
+//                 enumerate_modules_model.cc gets deleted.
+void EnumerateShellExtensionPaths(
+    const base::Callback<void(const base::FilePath&)>& callback);
+
+// Finds shell extensions installed on the computer by enumerating the registry.
+// In addition to the file path, the SizeOfImage and TimeDateStamp of the module
+// is returned via the callback.
+using OnShellExtensionEnumeratedCallback =
+    base::Callback<void(const base::FilePath&, uint32_t, uint32_t)>;
+void EnumerateShellExtensions(
+    OnShellExtensionEnumeratedCallback on_shell_extension_enumerated);
+
+#endif  // CHROME_BROWSER_CONFLICTS_ENUMERATE_SHELL_EXTENSIONS_WIN_H_
diff --git a/chrome/browser/conflicts/enumerate_shell_extensions_win_unittest.cc b/chrome/browser/conflicts/enumerate_shell_extensions_win_unittest.cc
new file mode 100644
index 0000000..52de0b26
--- /dev/null
+++ b/chrome/browser/conflicts/enumerate_shell_extensions_win_unittest.cc
@@ -0,0 +1,126 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/conflicts/enumerate_shell_extensions_win.h"
+
+#include <tuple>
+#include <vector>
+
+#include "base/bind.h"
+#include "base/files/file_path.h"
+#include "base/path_service.h"
+#include "base/stl_util.h"
+#include "base/strings/stringprintf.h"
+#include "base/test/scoped_task_environment.h"
+#include "base/test/test_reg_util_win.h"
+#include "chrome/browser/conflicts/module_info_util_win.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace {
+
+class EnumerateShellExtensionsTest : public testing::Test {
+ public:
+  EnumerateShellExtensionsTest() = default;
+
+  ~EnumerateShellExtensionsTest() override = default;
+
+  // Override all registry hives so that real shell extensions don't mess up
+  // the unit tests.
+  void SetUp() override {
+    ASSERT_NO_FATAL_FAILURE(
+        registry_override_manager_.OverrideRegistry(HKEY_CLASSES_ROOT));
+    ASSERT_NO_FATAL_FAILURE(
+        registry_override_manager_.OverrideRegistry(HKEY_CURRENT_USER));
+    ASSERT_NO_FATAL_FAILURE(
+        registry_override_manager_.OverrideRegistry(HKEY_LOCAL_MACHINE));
+  }
+
+  void RunUntilIdle() { scoped_task_environment_.RunUntilIdle(); }
+
+ private:
+  base::test::ScopedTaskEnvironment scoped_task_environment_;
+
+  registry_util::RegistryOverrideManager registry_override_manager_;
+
+  DISALLOW_COPY_AND_ASSIGN(EnumerateShellExtensionsTest);
+};
+
+// Adds a fake shell extension entry to the registry that should be found by
+// the ShellExtensionEnumerator. The call must be wrapped inside an
+// ASSERT_NO_FATAL_FAILURE.
+void RegisterFakeShellExtension(HKEY key,
+                                const wchar_t* guid,
+                                const wchar_t* path) {
+  base::win::RegKey class_id(
+      HKEY_CLASSES_ROOT,
+      base::StringPrintf(kClassIdRegistryKeyFormat, guid).c_str(), KEY_WRITE);
+  ASSERT_TRUE(class_id.Valid());
+
+  ASSERT_EQ(ERROR_SUCCESS, class_id.WriteValue(nullptr, path));
+
+  base::win::RegKey registration(key, kShellExtensionRegistryKey, KEY_WRITE);
+  ASSERT_EQ(ERROR_SUCCESS, registration.WriteValue(guid, L""));
+}
+
+void OnShellExtensionPathEnumerated(
+    std::vector<base::FilePath>* shell_extension_paths,
+    const base::FilePath& path) {
+  shell_extension_paths->push_back(path);
+}
+
+void OnShellExtensionEnumerated(
+    std::vector<base::FilePath>* shell_extension_paths,
+    const base::FilePath& path,
+    uint32_t size_of_image,
+    uint32_t time_date_stamp) {
+  shell_extension_paths->push_back(path);
+}
+
+}  // namespace
+
+// Registers a few fake shell extensions then see if
+// EnumerateShellExtensionPaths() finds them.
+TEST_F(EnumerateShellExtensionsTest, EnumerateShellExtensionPaths) {
+  const std::tuple<HKEY, const wchar_t*, const wchar_t*> test_cases[] = {
+      {HKEY_CURRENT_USER, L"{FAKE_GUID_0001}", L"c:\\module.dll"},
+      {HKEY_LOCAL_MACHINE, L"{FAKE_GUID_0002}", L"c:\\dir\\shell_ext.dll"},
+      {HKEY_LOCAL_MACHINE, L"{FAKE_GUID_0003}", L"c:\\path\\test.dll"},
+  };
+
+  // Register all fake shell extensions in test_cases.
+  for (const auto& test_case : test_cases) {
+    ASSERT_NO_FATAL_FAILURE(RegisterFakeShellExtension(std::get<0>(test_case),
+                                                       std::get<1>(test_case),
+                                                       std::get<2>(test_case)));
+  }
+
+  std::vector<base::FilePath> shell_extension_paths;
+  EnumerateShellExtensionPaths(
+      base::BindRepeating(&OnShellExtensionPathEnumerated,
+                          base::Unretained(&shell_extension_paths)));
+
+  ASSERT_EQ(3u, shell_extension_paths.size());
+  for (size_t i = 0; i < arraysize(test_cases); i++) {
+    // The inefficiency is fine as long as the number of test cases stays small.
+    EXPECT_TRUE(base::ContainsValue(
+        shell_extension_paths, base::FilePath(std::get<2>(test_cases[i]))));
+  }
+}
+
+TEST_F(EnumerateShellExtensionsTest, EnumerateShellExtensions) {
+  // Use the current exe file as an arbitrary module that exists.
+  base::FilePath file_exe;
+  ASSERT_TRUE(base::PathService::Get(base::FILE_EXE, &file_exe));
+  ASSERT_NO_FATAL_FAILURE(RegisterFakeShellExtension(
+      HKEY_LOCAL_MACHINE, L"{FAKE_GUID}", file_exe.value().c_str()));
+
+  std::vector<base::FilePath> shell_extension_paths;
+  EnumerateShellExtensions(base::BindRepeating(
+      &OnShellExtensionEnumerated, base::Unretained(&shell_extension_paths)));
+
+  RunUntilIdle();
+
+  ASSERT_EQ(1u, shell_extension_paths.size());
+  EXPECT_EQ(file_exe, shell_extension_paths[0]);
+}
diff --git a/chrome/browser/conflicts/module_info_util_win.cc b/chrome/browser/conflicts/module_info_util_win.cc
index 9059453b..e392417b 100644
--- a/chrome/browser/conflicts/module_info_util_win.cc
+++ b/chrome/browser/conflicts/module_info_util_win.cc
@@ -221,6 +221,8 @@
 
 }  // namespace
 
+const wchar_t kClassIdRegistryKeyFormat[] = L"CLSID\\%ls\\InProcServer32";
+
 // ModuleDatabase::CertificateInfo ---------------------------------------------
 
 CertificateInfo::CertificateInfo() : type(CertificateType::NO_CERTIFICATE) {}
diff --git a/chrome/browser/conflicts/module_info_util_win.h b/chrome/browser/conflicts/module_info_util_win.h
index 55e71b08..9525ffbf 100644
--- a/chrome/browser/conflicts/module_info_util_win.h
+++ b/chrome/browser/conflicts/module_info_util_win.h
@@ -11,6 +11,10 @@
 #include "base/files/file_path.h"
 #include "base/strings/string16.h"
 
+// A format string for generating paths to COM class in-proc server keys under
+// HKEY_CLASSES_ROOT.
+extern const wchar_t kClassIdRegistryKeyFormat[];
+
 // The type of certificate found for the module.
 enum class CertificateType {
   // The module is not signed.
diff --git a/chrome/browser/conflicts/shell_extension_enumerator_win.cc b/chrome/browser/conflicts/shell_extension_enumerator_win.cc
deleted file mode 100644
index 204d235..0000000
--- a/chrome/browser/conflicts/shell_extension_enumerator_win.cc
+++ /dev/null
@@ -1,116 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/conflicts/shell_extension_enumerator_win.h"
-
-#include "base/memory/ref_counted.h"
-#include "base/metrics/histogram_functions.h"
-#include "base/strings/string16.h"
-#include "base/strings/stringprintf.h"
-#include "base/task_scheduler/post_task.h"
-#include "base/task_scheduler/task_traits.h"
-#include "base/threading/sequenced_task_runner_handle.h"
-#include "base/threading/thread_restrictions.h"
-#include "base/win/registry.h"
-#include "chrome/browser/conflicts/module_info_util_win.h"
-
-namespace {
-
-void ReadShellExtensions(
-    HKEY parent,
-    const base::Callback<void(const base::FilePath&)>& callback,
-    int* nb_shell_extensions) {
-  for (base::win::RegistryValueIterator iter(
-           parent, ShellExtensionEnumerator::kShellExtensionRegistryKey);
-       iter.Valid(); ++iter) {
-    base::string16 key = base::StringPrintf(
-        ShellExtensionEnumerator::kClassIdRegistryKeyFormat, iter.Name());
-
-    base::win::RegKey clsid;
-    if (clsid.Open(HKEY_CLASSES_ROOT, key.c_str(), KEY_READ) != ERROR_SUCCESS)
-      continue;
-
-    base::string16 dll;
-    if (clsid.ReadValue(L"", &dll) != ERROR_SUCCESS)
-      continue;
-
-    nb_shell_extensions++;
-    callback.Run(base::FilePath(dll));
-  }
-}
-
-}  // namespace
-
-// static
-const wchar_t ShellExtensionEnumerator::kShellExtensionRegistryKey[] =
-    L"Software\\Microsoft\\Windows\\CurrentVersion\\Shell "
-    L"Extensions\\Approved";
-
-// static
-const wchar_t ShellExtensionEnumerator::kClassIdRegistryKeyFormat[] =
-    L"CLSID\\%ls\\InProcServer32";
-
-ShellExtensionEnumerator::ShellExtensionEnumerator(
-    const OnShellExtensionEnumeratedCallback&
-        on_shell_extension_enumerated_callback)
-    : on_shell_extension_enumerated_callback_(
-          on_shell_extension_enumerated_callback),
-      weak_ptr_factory_(this) {
-  base::PostTaskWithTraits(
-      FROM_HERE,
-      {base::MayBlock(), base::TaskPriority::BACKGROUND,
-       base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN},
-      base::Bind(
-          &EnumerateShellExtensionsImpl, base::SequencedTaskRunnerHandle::Get(),
-          base::Bind(&ShellExtensionEnumerator::OnShellExtensionEnumerated,
-                     weak_ptr_factory_.GetWeakPtr())));
-}
-
-ShellExtensionEnumerator::~ShellExtensionEnumerator() = default;
-
-// static
-void ShellExtensionEnumerator::EnumerateShellExtensionPaths(
-    const base::Callback<void(const base::FilePath&)>& callback) {
-  base::ThreadRestrictions::AssertIOAllowed();
-
-  int nb_shell_extensions = 0;
-  ReadShellExtensions(HKEY_LOCAL_MACHINE, callback, &nb_shell_extensions);
-  ReadShellExtensions(HKEY_CURRENT_USER, callback, &nb_shell_extensions);
-
-  base::UmaHistogramCounts100("ThirdPartyModules.ShellExtensionsCount",
-                              nb_shell_extensions);
-}
-
-void ShellExtensionEnumerator::OnShellExtensionEnumerated(
-    const base::FilePath& path,
-    uint32_t size_of_image,
-    uint32_t time_date_stamp) {
-  on_shell_extension_enumerated_callback_.Run(path, size_of_image,
-                                              time_date_stamp);
-}
-
-// static
-void ShellExtensionEnumerator::EnumerateShellExtensionsImpl(
-    scoped_refptr<base::SequencedTaskRunner> task_runner,
-    const OnShellExtensionEnumeratedCallback& callback) {
-  ShellExtensionEnumerator::EnumerateShellExtensionPaths(
-      base::Bind(&ShellExtensionEnumerator::OnShellExtensionPathEnumerated,
-                 task_runner, callback));
-}
-
-// static
-void ShellExtensionEnumerator::OnShellExtensionPathEnumerated(
-    scoped_refptr<base::SequencedTaskRunner> task_runner,
-    const OnShellExtensionEnumeratedCallback& callback,
-    const base::FilePath& path) {
-  uint32_t size_of_image = 0;
-  uint32_t time_date_stamp = 0;
-  if (!GetModuleImageSizeAndTimeDateStamp(path, &size_of_image,
-                                          &time_date_stamp)) {
-    return;
-  }
-
-  task_runner->PostTask(
-      FROM_HERE, base::Bind(callback, path, size_of_image, time_date_stamp));
-}
diff --git a/chrome/browser/conflicts/shell_extension_enumerator_win.h b/chrome/browser/conflicts/shell_extension_enumerator_win.h
deleted file mode 100644
index bde0932e..0000000
--- a/chrome/browser/conflicts/shell_extension_enumerator_win.h
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_CONFLICTS_SHELL_EXTENSION_ENUMERATOR_WIN_H_
-#define CHROME_BROWSER_CONFLICTS_SHELL_EXTENSION_ENUMERATOR_WIN_H_
-
-#include "base/callback.h"
-#include "base/files/file_path.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/weak_ptr.h"
-
-namespace base {
-class SequencedTaskRunner;
-}
-
-// Finds shell extensions installed on the computer by enumerating the registry.
-class ShellExtensionEnumerator {
- public:
-  // The path to the registry key where shell extensions are registered.
-  static const wchar_t kShellExtensionRegistryKey[];
-  static const wchar_t kClassIdRegistryKeyFormat[];
-
-  using OnShellExtensionEnumeratedCallback =
-      base::Callback<void(const base::FilePath&, uint32_t, uint32_t)>;
-
-  explicit ShellExtensionEnumerator(const OnShellExtensionEnumeratedCallback&
-                                        on_shell_extension_enumerated_callback);
-  ~ShellExtensionEnumerator();
-
-  // Enumerates registered shell extensions, and invokes |callback| once per
-  // shell extension found. Must be called on a blocking sequence.
-  //
-  // TODO(pmonette): Move this function to protected when
-  //                 enumerate_modules_model.cc gets deleted.
-  static void EnumerateShellExtensionPaths(
-      const base::Callback<void(const base::FilePath&)>& callback);
-
- private:
-  void OnShellExtensionEnumerated(const base::FilePath& path,
-                                  uint32_t size_of_image,
-                                  uint32_t time_date_stamp);
-
-  static void EnumerateShellExtensionsImpl(
-      scoped_refptr<base::SequencedTaskRunner> task_runner,
-      const OnShellExtensionEnumeratedCallback& callback);
-
-  static void OnShellExtensionPathEnumerated(
-      scoped_refptr<base::SequencedTaskRunner> task_runner,
-      const OnShellExtensionEnumeratedCallback& callback,
-      const base::FilePath& path);
-
-  OnShellExtensionEnumeratedCallback on_shell_extension_enumerated_callback_;
-
-  base::WeakPtrFactory<ShellExtensionEnumerator> weak_ptr_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(ShellExtensionEnumerator);
-};
-
-#endif  // CHROME_BROWSER_CONFLICTS_SHELL_EXTENSION_ENUMERATOR_WIN_H_
diff --git a/chrome/browser/conflicts/shell_extension_enumerator_win_unittest.cc b/chrome/browser/conflicts/shell_extension_enumerator_win_unittest.cc
deleted file mode 100644
index 26fd9b9..0000000
--- a/chrome/browser/conflicts/shell_extension_enumerator_win_unittest.cc
+++ /dev/null
@@ -1,129 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/conflicts/shell_extension_enumerator_win.h"
-
-#include <tuple>
-#include <vector>
-
-#include "base/bind.h"
-#include "base/files/file_path.h"
-#include "base/macros.h"
-#include "base/path_service.h"
-#include "base/stl_util.h"
-#include "base/strings/string_util.h"
-#include "base/strings/stringprintf.h"
-#include "base/test/scoped_task_environment.h"
-#include "base/test/test_reg_util_win.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace {
-
-class ShellExtensionEnumeratorTest : public testing::Test {
- public:
-  ShellExtensionEnumeratorTest() : shell_extension_count_(0) {}
-
-  ~ShellExtensionEnumeratorTest() override = default;
-
-  // Override all registry hives so that real shell extensions don't mess up
-  // the unit tests.
-  void OverrideRegistryHives() {
-    registry_override_manager_.OverrideRegistry(HKEY_CLASSES_ROOT);
-    registry_override_manager_.OverrideRegistry(HKEY_CURRENT_USER);
-    registry_override_manager_.OverrideRegistry(HKEY_LOCAL_MACHINE);
-  }
-
-  void OnShellExtensionEnumerated(const base::FilePath& path,
-                                  uint32_t size_of_image,
-                                  uint32_t time_date_stamp) {
-    shell_extension_count_++;
-  }
-
-  int shell_extension_count() { return shell_extension_count_; }
-
-  void RunUntilIdle() { scoped_task_environment_.RunUntilIdle(); }
-
- private:
-  base::test::ScopedTaskEnvironment scoped_task_environment_;
-
-  registry_util::RegistryOverrideManager registry_override_manager_;
-
-  // Counts the number of shell extensions found via enumeration.
-  int shell_extension_count_;
-};
-
-// Adds a fake shell extension entry to the registry that should be found by
-// the ShellExtensionEnumerator.
-void RegisterFakeShellExtension(HKEY key,
-                                const wchar_t* guid,
-                                const wchar_t* path) {
-  base::win::RegKey class_id(
-      HKEY_CLASSES_ROOT,
-      base::StringPrintf(ShellExtensionEnumerator::kClassIdRegistryKeyFormat,
-                         guid)
-          .c_str(),
-      KEY_WRITE);
-  class_id.WriteValue(nullptr, path);
-
-  base::win::RegKey registration(
-      key, ShellExtensionEnumerator::kShellExtensionRegistryKey, KEY_WRITE);
-  registration.WriteValue(guid, L"");
-}
-
-void OnShellExtensionPathEnumerated(
-    std::vector<base::FilePath>* shell_extension_paths,
-    const base::FilePath& path) {
-  shell_extension_paths->push_back(path);
-}
-
-}  // namespace
-
-// Registers a few fake shell extensions then see if
-// EnumerateShellExtensionPaths() finds them.
-TEST_F(ShellExtensionEnumeratorTest, EnumerateShellExtensionPaths) {
-  const std::tuple<HKEY, const wchar_t*, const wchar_t*> test_cases[] = {
-      {HKEY_CURRENT_USER, L"{FAKE_GUID_0001}", L"c:\\module.dll"},
-      {HKEY_LOCAL_MACHINE, L"{FAKE_GUID_0002}", L"c:\\dir\\shell_ext.dll"},
-      {HKEY_LOCAL_MACHINE, L"{FAKE_GUID_0003}", L"c:\\path\\test.dll"},
-  };
-
-  OverrideRegistryHives();
-
-  // Register all fake shell extensions in test_cases.
-  for (const auto& test_case : test_cases) {
-    RegisterFakeShellExtension(std::get<0>(test_case), std::get<1>(test_case),
-                               std::get<2>(test_case));
-  }
-
-  std::vector<base::FilePath> shell_extension_paths;
-  ShellExtensionEnumerator::EnumerateShellExtensionPaths(
-      base::Bind(&OnShellExtensionPathEnumerated,
-                 base::Unretained(&shell_extension_paths)));
-
-  ASSERT_EQ(3u, shell_extension_paths.size());
-  for (size_t i = 0; i < arraysize(test_cases); i++) {
-    // The inefficiency is fine as long as the number of test cases stay small.
-    EXPECT_TRUE(base::ContainsValue(
-        shell_extension_paths, base::FilePath(std::get<2>(test_cases[i]))));
-  }
-}
-
-TEST_F(ShellExtensionEnumeratorTest, EnumerateShellExtensions) {
-  OverrideRegistryHives();
-
-  // Use the current exe file as an arbitrary module that exists.
-  base::FilePath file_exe;
-  ASSERT_TRUE(base::PathService::Get(base::FILE_EXE, &file_exe));
-  RegisterFakeShellExtension(HKEY_LOCAL_MACHINE, L"{FAKE_GUID}",
-                             file_exe.value().c_str());
-  EXPECT_EQ(0, shell_extension_count());
-
-  ShellExtensionEnumerator shell_extension_enumerator(
-      base::Bind(&ShellExtensionEnumeratorTest::OnShellExtensionEnumerated,
-                 base::Unretained(this)));
-
-  RunUntilIdle();
-
-  EXPECT_EQ(1, shell_extension_count());
-}
diff --git a/chrome/browser/diagnostics/recon_diagnostics.cc b/chrome/browser/diagnostics/recon_diagnostics.cc
index bc953c1..df53527 100644
--- a/chrome/browser/diagnostics/recon_diagnostics.cc
+++ b/chrome/browser/diagnostics/recon_diagnostics.cc
@@ -30,7 +30,6 @@
 #include "components/version_info/version_info.h"
 
 #if defined(OS_WIN)
-#include "base/win/windows_version.h"
 #include "chrome/browser/win/enumerate_modules_model.h"
 #include "chrome/installer/util/install_util.h"
 #endif
@@ -188,22 +187,10 @@
       : DiagnosticsTest(DIAGNOSTICS_OPERATING_SYSTEM_TEST) {}
 
   bool ExecuteImpl(DiagnosticsModel::Observer* observer) override {
-#if defined(OS_WIN)
-    base::win::Version version = base::win::GetVersion();
-    if ((version < base::win::VERSION_XP) ||
-        ((version == base::win::VERSION_XP) &&
-         (base::win::OSInfo::GetInstance()->service_pack().major < 2))) {
-      RecordFailure(DIAG_RECON_PRE_WINDOW_XP_SP2,
-                    "Must have Windows XP SP2 or later");
-      return false;
-    }
-#else
-// TODO(port): define the OS criteria for Linux and Mac.
-#endif  // defined(OS_WIN)
-    RecordSuccess(
-        base::StringPrintf("%s %s",
-                           base::SysInfo::OperatingSystemName().c_str(),
-                           base::SysInfo::OperatingSystemVersion().c_str()));
+    // TODO(port): define the OS criteria for Linux and Mac.
+    RecordSuccess(base::StringPrintf(
+        "%s %s", base::SysInfo::OperatingSystemName().c_str(),
+        base::SysInfo::OperatingSystemVersion().c_str()));
     return true;
   }
 
diff --git a/chrome/browser/download/download_request_limiter.cc b/chrome/browser/download/download_request_limiter.cc
index ce379f7..2c933fe 100644
--- a/chrome/browser/download/download_request_limiter.cc
+++ b/chrome/browser/download/download_request_limiter.cc
@@ -13,6 +13,7 @@
 #include "chrome/browser/permissions/permission_request_manager.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/tab_contents/tab_util.h"
+#include "chrome/browser/vr/vr_tab_helper.h"
 #include "components/content_settings/core/browser/content_settings_details.h"
 #include "components/content_settings/core/browser/host_content_settings_map.h"
 #include "content/public/browser/browser_context.h"
@@ -208,6 +209,14 @@
   if (is_showing_prompt())
     return;
 
+  if (vr::VrTabHelper::IsInVr(web_contents_)) {
+    // Permission request UI cannot currently be rendered binocularly in VR
+    // mode, so we suppress the UI and return cancelled to inform the caller
+    // that the request will not progress. crbug.com/736568
+    Cancel();
+    return;
+  }
+
   if (PermissionRequestManager::IsEnabled()) {
     PermissionRequestManager* permission_request_manager =
         PermissionRequestManager::FromWebContents(web_contents_);
diff --git a/chrome/browser/download/download_request_limiter_unittest.cc b/chrome/browser/download/download_request_limiter_unittest.cc
index a8d9907e..cd0fb45 100644
--- a/chrome/browser/download/download_request_limiter_unittest.cc
+++ b/chrome/browser/download/download_request_limiter_unittest.cc
@@ -14,6 +14,7 @@
 #include "chrome/browser/permissions/permission_request_manager.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/permission_bubble/mock_permission_prompt_factory.h"
+#include "chrome/browser/vr/vr_tab_helper.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
 #include "components/content_settings/core/browser/host_content_settings_map.h"
@@ -228,7 +229,7 @@
 #endif
 };
 
-TEST_F(DownloadRequestLimiterTest, DownloadRequestLimiter_Allow) {
+TEST_F(DownloadRequestLimiterTest, Allow) {
   NavigateAndCommit(GURL("http://foo.com/bar"));
   LoadCompleted();
 
@@ -261,7 +262,7 @@
             download_request_limiter_->GetDownloadStatus(web_contents()));
 }
 
-TEST_F(DownloadRequestLimiterTest, DownloadRequestLimiter_ResetOnNavigation) {
+TEST_F(DownloadRequestLimiterTest, ResetOnNavigation) {
   NavigateAndCommit(GURL("http://foo.com/bar"));
   LoadCompleted();
 
@@ -321,7 +322,7 @@
             download_request_limiter_->GetDownloadStatus(web_contents()));
 }
 
-TEST_F(DownloadRequestLimiterTest, DownloadRequestLimiter_RendererInitiated) {
+TEST_F(DownloadRequestLimiterTest, RendererInitiated) {
   NavigateAndCommit(GURL("http://foo.com/bar"));
   LoadCompleted();
 
@@ -511,7 +512,7 @@
             download_request_limiter_->GetDownloadStatus(web_contents()));
 }
 
-TEST_F(DownloadRequestLimiterTest, DownloadRequestLimiter_ResetOnReload) {
+TEST_F(DownloadRequestLimiterTest, ResetOnReload) {
   NavigateAndCommit(GURL("http://foo.com/bar"));
   LoadCompleted();
   ASSERT_EQ(DownloadRequestLimiter::ALLOW_ONE_DOWNLOAD,
@@ -561,7 +562,7 @@
             download_request_limiter_->GetDownloadStatus(web_contents()));
 }
 
-TEST_F(DownloadRequestLimiterTest, DownloadRequestLimiter_RawWebContents) {
+TEST_F(DownloadRequestLimiterTest, RawWebContents) {
   std::unique_ptr<WebContents> web_contents(CreateTestWebContents());
 
   GURL url("http://foo.com/bar");
@@ -602,8 +603,7 @@
             download_request_limiter_->GetDownloadStatus(web_contents.get()));
 }
 
-TEST_F(DownloadRequestLimiterTest,
-       DownloadRequestLimiter_SetHostContentSetting) {
+TEST_F(DownloadRequestLimiterTest, SetHostContentSetting) {
   NavigateAndCommit(GURL("http://foo.com/bar"));
   LoadCompleted();
   SetHostContentSetting(web_contents(), CONTENT_SETTING_ALLOW);
@@ -631,8 +631,7 @@
             download_request_limiter_->GetDownloadStatus(web_contents()));
 }
 
-TEST_F(DownloadRequestLimiterTest,
-       DownloadRequestLimiter_ContentSettingChanged) {
+TEST_F(DownloadRequestLimiterTest, ContentSettingChanged) {
   NavigateAndCommit(GURL("http://foo.com/bar"));
   LoadCompleted();
   ASSERT_EQ(DownloadRequestLimiter::ALLOW_ONE_DOWNLOAD,
@@ -686,3 +685,23 @@
   ASSERT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
             download_request_limiter_->GetDownloadStatus(web_contents()));
 }
+
+TEST_F(DownloadRequestLimiterTest, SuppressRequestsInVRMode) {
+  NavigateAndCommit(GURL("http://foo.com/bar"));
+  LoadCompleted();
+
+  EXPECT_FALSE(vr::VrTabHelper::IsInVr(web_contents()));
+  vr::VrTabHelper* vr_tab_helper =
+      vr::VrTabHelper::FromWebContents(web_contents());
+  vr_tab_helper->SetIsInVr(true);
+
+  CanDownload();
+  ExpectAndResetCounts(1, 0, 0, __LINE__);
+  ASSERT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
+            download_request_limiter_->GetDownloadStatus(web_contents()));
+
+  CanDownload();
+  ExpectAndResetCounts(0, 1, 0, __LINE__);
+  ASSERT_EQ(DownloadRequestLimiter::DOWNLOADS_NOT_ALLOWED,
+            download_request_limiter_->GetDownloadStatus(web_contents()));
+}
diff --git a/chrome/browser/extensions/api/tab_capture/offscreen_tab.cc b/chrome/browser/extensions/api/tab_capture/offscreen_tab.cc
index 5fd6703..bff8d13 100644
--- a/chrome/browser/extensions/api/tab_capture/offscreen_tab.cc
+++ b/chrome/browser/extensions/api/tab_capture/offscreen_tab.cc
@@ -14,6 +14,7 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/web_contents_sizer.h"
 #include "content/public/browser/keyboard_event_processing_result.h"
+#include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/render_view_host.h"
 #include "content/public/browser/render_widget_host_view.h"
 #include "content/public/browser/web_contents.h"
@@ -29,7 +30,7 @@
 
 // Upper limit on the number of simultaneous off-screen tabs per extension
 // instance.
-const int kMaxOffscreenTabsPerExtension = 3;
+const int kMaxOffscreenTabsPerExtension = 4;
 
 // Time intervals used by the logic that detects when the capture of an
 // offscreen tab has stopped, to automatically tear it down and free resources.
@@ -82,13 +83,42 @@
   }
 }
 
+// Navigation policy for presentations, where top-level navigations are not
+// allowed.
+class OffscreenTab::PresentationNavigationPolicy
+    : public OffscreenTab::NavigationPolicy {
+ public:
+  PresentationNavigationPolicy() : first_navigation_started_(false) {}
+  ~PresentationNavigationPolicy() = default;
+
+ private:
+  // OffscreenTab::NavigationPolicy overrides
+  bool DidStartNavigation(content::NavigationHandle* navigation_handle) final {
+    // We only care about top-level navigations that are cross-document.
+    if (!navigation_handle->IsInMainFrame() ||
+        navigation_handle->IsSameDocument()) {
+      return true;
+    }
+
+    // The initial navigation had already begun.
+    if (first_navigation_started_)
+      return false;
+
+    first_navigation_started_ = true;
+    return true;
+  }
+
+  bool first_navigation_started_;
+};
+
 OffscreenTab::OffscreenTab(OffscreenTabsOwner* owner)
     : owner_(owner),
       profile_(Profile::FromBrowserContext(
                    owner->extension_web_contents()->GetBrowserContext())
-               ->CreateOffTheRecordProfile()),
+                   ->CreateOffTheRecordProfile()),
       capture_poll_timer_(false, false),
-      content_capture_was_detected_(false) {
+      content_capture_was_detected_(false),
+      navigation_policy_(new NavigationPolicy) {
   DCHECK(profile_);
 }
 
@@ -120,11 +150,15 @@
   offscreen_tab_web_contents_->SetAudioMuted(true);
 
   if (!optional_presentation_id.empty()) {
-    DVLOG(1) << " Register with ReceiverPresentationServiceDelegateImpl, "
-             << "[presentation_id]: " << optional_presentation_id;
-    // Create a ReceiverPSDImpl associated with the offscreen tab's WebContents.
-    // The new instance will set up the necessary infrastructure to allow
-    // controlling peers the ability to connect to the offscreen tab.
+    // This offscreen tab is a presentation created through the Presentation
+    // API. https://www.w3.org/TR/presentation-api/
+    //
+    // Create a ReceiverPresentationServiceDelegateImpl associated with the
+    // offscreen tab's WebContents.  The new instance will set up the necessary
+    // infrastructure to allow controlling pages the ability to connect to the
+    // offscreen tab.
+    DVLOG(1) << "Register with ReceiverPresentationServiceDelegateImpl, "
+             << "presentation_id=" << optional_presentation_id;
     media_router::ReceiverPresentationServiceDelegateImpl::CreateForWebContents(
         offscreen_tab_web_contents_.get(), optional_presentation_id);
 
@@ -134,6 +168,11 @@
       web_prefs.presentation_receiver = true;
       render_view_host->UpdateWebkitPreferences(web_prefs);
     }
+
+    // Presentations are not allowed to perform top-level navigations after
+    // initial load.  This is enforced through sandboxing flags, but we also
+    // enforce it here.
+    navigation_policy_.reset(new PresentationNavigationPolicy);
   }
 
   // Navigate to the initial URL.
@@ -146,11 +185,15 @@
   DieIfContentCaptureEnded();
 }
 
+void OffscreenTab::Close() {
+  if (offscreen_tab_web_contents_)
+    offscreen_tab_web_contents_->ClosePage();
+}
+
 void OffscreenTab::CloseContents(WebContents* source) {
   DCHECK_EQ(offscreen_tab_web_contents_.get(), source);
   // Javascript in the page called window.close().
-  DVLOG(1) << "OffscreenTab will die at renderer's request for start_url="
-           << start_url_.spec();
+  DVLOG(1) << "OffscreenTab for start_url=" << start_url_.spec() << " will die";
   owner_->DestroyTab(this);
   // |this| is no longer valid.
 }
@@ -159,6 +202,7 @@
   DCHECK_EQ(offscreen_tab_web_contents_.get(), source);
   // Suppress all because there is no possible direct user interaction with
   // dialogs.
+  // TODO(crbug.com/734191): This does not suppress window.print().
   return true;
 }
 
@@ -346,6 +390,25 @@
     current_fs_view->SetSize(offscreen_tab_web_contents_->GetPreferredSize());
 }
 
+void OffscreenTab::DidStartNavigation(
+    content::NavigationHandle* navigation_handle) {
+  DCHECK(offscreen_tab_web_contents_.get());
+  if (!navigation_policy_->DidStartNavigation(navigation_handle)) {
+    DVLOG(2) << "Closing because NavigationPolicy disallowed "
+             << "StartNavigation to " << navigation_handle->GetURL().spec();
+    Close();
+  }
+}
+
+// Default navigation policy.
+OffscreenTab::NavigationPolicy::NavigationPolicy() = default;
+OffscreenTab::NavigationPolicy::~NavigationPolicy() = default;
+
+bool OffscreenTab::NavigationPolicy::DidStartNavigation(
+    content::NavigationHandle* navigation_handle) {
+  return true;
+}
+
 void OffscreenTab::DieIfContentCaptureEnded() {
   DCHECK(offscreen_tab_web_contents_.get());
 
diff --git a/chrome/browser/extensions/api/tab_capture/offscreen_tab.h b/chrome/browser/extensions/api/tab_capture/offscreen_tab.h
index cf849ee6..b2a47deb 100644
--- a/chrome/browser/extensions/api/tab_capture/offscreen_tab.h
+++ b/chrome/browser/extensions/api/tab_capture/offscreen_tab.h
@@ -122,6 +122,9 @@
              const gfx::Size& initial_size,
              const std::string& optional_presentation_id);
 
+  // Closes the underlying WebContents.
+  void Close();
+
   // content::WebContentsDelegate overrides to provide the desired behaviors.
   void CloseContents(content::WebContents* source) final;
   bool ShouldSuppressDialogs(content::WebContents* source) final;
@@ -170,12 +173,27 @@
 
   // content::WebContentsObserver overrides
   void DidShowFullscreenWidget() final;
+  void DidStartNavigation(content::NavigationHandle* navigation_handle) final;
 
  private:
   bool in_fullscreen_mode() const {
     return !non_fullscreen_size_.IsEmpty();
   }
 
+  // Selected calls to the navigation methods in WebContentsObserver are
+  // delegated to this object to determine a navigation is allowed.  If any
+  // call returns false, the offscreen tab is destroyed.  The default policy
+  // allows all navigations.
+  class NavigationPolicy {
+   public:
+    NavigationPolicy();
+    ~NavigationPolicy();
+    virtual bool DidStartNavigation(
+        content::NavigationHandle* navigation_handle);
+  };
+
+  class PresentationNavigationPolicy;  // Forward declaration
+
   // Called by |capture_poll_timer_| to automatically destroy this OffscreenTab
   // when the capturer count returns to zero.
   void DieIfContentCaptureEnded();
@@ -213,6 +231,9 @@
   // |offscreen_tab_web_contents_| is first detected.
   bool content_capture_was_detected_;
 
+  // Object consulted to determine which offscreen tab navigations are allowed.
+  std::unique_ptr<NavigationPolicy> navigation_policy_;
+
   DISALLOW_COPY_AND_ASSIGN(OffscreenTab);
 };
 
diff --git a/chrome/browser/extensions/api/tab_capture/tab_capture_apitest.cc b/chrome/browser/extensions/api/tab_capture/tab_capture_apitest.cc
index 3a0266d6..1e12aacd 100644
--- a/chrome/browser/extensions/api/tab_capture/tab_capture_apitest.cc
+++ b/chrome/browser/extensions/api/tab_capture/tab_capture_apitest.cc
@@ -28,10 +28,6 @@
 #include "extensions/test/extension_test_message_listener.h"
 #include "extensions/test/result_catcher.h"
 
-#if defined(OS_WIN)
-#include "base/win/windows_version.h"
-#endif
-
 namespace extensions {
 
 namespace {
@@ -70,11 +66,6 @@
 
  protected:
   bool IsTooIntensiveForThisPlatform() const {
-#if defined(OS_WIN)
-    if (base::win::GetVersion() < base::win::VERSION_VISTA)
-      return true;
-#endif
-
     // The tests are too slow to succeed with software GL on the bots.
     if (UsingSoftwareGL())
       return true;
diff --git a/chrome/browser/google/google_update_win.cc b/chrome/browser/google/google_update_win.cc
index 48df175..93f35e3 100644
--- a/chrome/browser/google/google_update_win.cc
+++ b/chrome/browser/google/google_update_win.cc
@@ -31,7 +31,6 @@
 #include "base/time/time.h"
 #include "base/version.h"
 #include "base/win/scoped_bstr.h"
-#include "base/win/windows_version.h"
 #include "chrome/common/url_constants.h"
 #include "chrome/grit/generated_resources.h"
 #include "chrome/install_static/install_util.h"
@@ -122,9 +121,8 @@
                       EOAC_DYNAMIC_CLOAKING);
 }
 
-// Creates a class factory for a COM Local Server class using either plain
-// vanilla CoGetClassObject, or using the Elevation moniker if running on
-// Vista+. |hwnd| must refer to a foregound window in order to get the UAC
+// Creates a class factory for a COM Local Server class using the Elevation
+// moniker. |hwnd| must refer to a foregound window in order to get the UAC
 // prompt to appear in the foreground if running on Vista+. It can also be NULL
 // if background UAC prompts are desired.
 HRESULT CoGetClassObjectAsAdmin(gfx::AcceleratedWidget hwnd,
@@ -136,28 +134,22 @@
 
   // For Vista+, need to instantiate the class factory via the elevation
   // moniker. This ensures that the UAC dialog shows up.
-  if (base::win::GetVersion() >= base::win::VERSION_VISTA) {
-    wchar_t class_id_as_string[MAX_PATH] = {};
-    StringFromGUID2(class_id, class_id_as_string,
-                    arraysize(class_id_as_string));
+  wchar_t class_id_as_string[MAX_PATH] = {};
+  StringFromGUID2(class_id, class_id_as_string, arraysize(class_id_as_string));
 
-    base::string16 elevation_moniker_name = base::StringPrintf(
-        L"Elevation:Administrator!clsid:%ls", class_id_as_string);
+  base::string16 elevation_moniker_name = base::StringPrintf(
+      L"Elevation:Administrator!clsid:%ls", class_id_as_string);
 
-    BIND_OPTS3 bind_opts;
-    // An explicit memset is needed rather than relying on value initialization
-    // since BIND_OPTS3 is not an aggregate (it is a derived type).
-    memset(&bind_opts, 0, sizeof(bind_opts));
-    bind_opts.cbStruct = sizeof(bind_opts);
-    bind_opts.dwClassContext = CLSCTX_LOCAL_SERVER;
-    bind_opts.hwnd = hwnd;
+  BIND_OPTS3 bind_opts;
+  // An explicit memset is needed rather than relying on value initialization
+  // since BIND_OPTS3 is not an aggregate (it is a derived type).
+  memset(&bind_opts, 0, sizeof(bind_opts));
+  bind_opts.cbStruct = sizeof(bind_opts);
+  bind_opts.dwClassContext = CLSCTX_LOCAL_SERVER;
+  bind_opts.hwnd = hwnd;
 
-    return ::CoGetObject(elevation_moniker_name.c_str(), &bind_opts,
-                         interface_id, interface_ptr);
-  }
-
-  return ::CoGetClassObject(class_id, CLSCTX_LOCAL_SERVER, nullptr,
-                            interface_id, interface_ptr);
+  return ::CoGetObject(elevation_moniker_name.c_str(), &bind_opts, interface_id,
+                       interface_ptr);
 }
 
 HRESULT CreateGoogleUpdate3WebClass(
diff --git a/chrome/browser/io_thread.cc b/chrome/browser/io_thread.cc
index 41cfd40..9dcd7f0 100644
--- a/chrome/browser/io_thread.cc
+++ b/chrome/browser/io_thread.cc
@@ -264,9 +264,9 @@
 
 net::URLRequestContext* SystemURLRequestContextGetter::GetURLRequestContext() {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  DCHECK(io_thread_->globals()->system_request_context.get());
+  DCHECK(io_thread_->globals()->system_request_context);
 
-  return io_thread_->globals()->system_request_context.get();
+  return io_thread_->globals()->system_request_context;
 }
 
 scoped_refptr<base::SingleThreadTaskRunner>
@@ -283,12 +283,14 @@
 
 IOThread::Globals::
 SystemRequestContextLeakChecker::~SystemRequestContextLeakChecker() {
-  if (globals_->system_request_context.get())
+  if (globals_->system_request_context)
     globals_->system_request_context->AssertNoURLRequests();
 }
 
-IOThread::Globals::Globals() : system_request_context_leak_checker(this),
-                               enable_brotli(false) {}
+IOThread::Globals::Globals()
+    : system_request_context(nullptr),
+      system_request_context_leak_checker(this),
+      enable_brotli(false) {}
 
 IOThread::Globals::~Globals() {}
 
@@ -398,6 +400,9 @@
       std::unique_ptr<net::ct::STHDistributor>(new net::ct::STHDistributor()));
 
   BrowserThread::SetIOThreadDelegate(this);
+
+  SystemNetworkContextManager::SetUp(&network_context_request_,
+                                     &network_context_params_);
 }
 
 IOThread::~IOThread() {
@@ -785,14 +790,15 @@
 void IOThread::ConstructSystemRequestContext() {
   const base::CommandLine& command_line =
       *base::CommandLine::ForCurrentProcess();
-  net::URLRequestContextBuilderMojo builder;
+  std::unique_ptr<net::URLRequestContextBuilderMojo> builder =
+      base::MakeUnique<net::URLRequestContextBuilderMojo>();
 
-  builder.set_network_quality_estimator(
+  builder->set_network_quality_estimator(
       globals_->network_quality_estimator.get());
-  builder.set_enable_brotli(globals_->enable_brotli);
-  builder.set_name("system");
+  builder->set_enable_brotli(globals_->enable_brotli);
+  builder->set_name("system");
 
-  builder.set_user_agent(GetUserAgent());
+  builder->set_user_agent(GetUserAgent());
   std::unique_ptr<ChromeNetworkDelegate> chrome_network_delegate(
       new ChromeNetworkDelegate(extension_event_router_forwarder(),
                                 &system_enable_referrers_));
@@ -800,26 +806,26 @@
   chrome_network_delegate->set_data_use_aggregator(
       globals_->data_use_aggregator.get(),
       true /* is_data_usage_off_the_record */);
-  builder.set_network_delegate(
+  builder->set_network_delegate(
       globals_->data_use_ascriber->CreateNetworkDelegate(
           std::move(chrome_network_delegate), GetMetricsDataUseForwarder()));
-  builder.set_net_log(net_log_);
+  builder->set_net_log(net_log_);
   std::unique_ptr<net::HostResolver> host_resolver(
       CreateGlobalHostResolver(net_log_));
 
-  builder.set_ssl_config_service(GetSSLConfigService());
-  builder.SetHttpAuthHandlerFactory(
+  builder->set_ssl_config_service(GetSSLConfigService());
+  builder->SetHttpAuthHandlerFactory(
       CreateDefaultAuthHandlerFactory(host_resolver.get()));
 
-  builder.set_host_resolver(std::move(host_resolver));
+  builder->set_host_resolver(std::move(host_resolver));
 
 #if defined(OS_CHROMEOS)
   // Creates a CertVerifyProc that doesn't allow any profile-provided certs.
-  builder.SetCertVerifier(base::MakeUnique<net::CachingCertVerifier>(
+  builder->SetCertVerifier(base::MakeUnique<net::CachingCertVerifier>(
       base::MakeUnique<net::MultiThreadedCertVerifier>(
           new chromeos::CertVerifyProcChromeOS())));
 #else
-  builder.SetCertVerifier(IgnoreErrorsCertVerifier::MaybeWrapCertVerifier(
+  builder->SetCertVerifier(IgnoreErrorsCertVerifier::MaybeWrapCertVerifier(
       command_line, net::CertVerifier::CreateDefault()));
   UMA_HISTOGRAM_BOOLEAN(
       "Net.Certificate.IgnoreCertificateErrorsSPKIListPresent",
@@ -834,7 +840,7 @@
   // Register the ct_tree_tracker_ as observer for verified SCTs.
   ct_verifier->SetObserver(ct_tree_tracker_.get());
 
-  builder.set_ct_verifier(std::move(ct_verifier));
+  builder->set_ct_verifier(std::move(ct_verifier));
 
   // TODO(eroman): Figure out why this doesn't work in single-process mode.
   // Should be possible now that a private isolate is used.
@@ -843,40 +849,45 @@
     if (command_line.HasSwitch(switches::kSingleProcess)) {
       LOG(ERROR) << "Cannot use V8 Proxy resolver in single process mode.";
     } else {
-      builder.set_mojo_proxy_resolver_factory(
+      builder->set_mojo_proxy_resolver_factory(
           ChromeMojoProxyResolverFactory::GetInstance());
     }
   }
 
-  builder.set_pac_quick_check_enabled(WpadQuickCheckEnabled());
-  builder.set_pac_sanitize_url_policy(
+  builder->set_pac_quick_check_enabled(WpadQuickCheckEnabled());
+  builder->set_pac_sanitize_url_policy(
       PacHttpsUrlStrippingEnabled()
           ? net::ProxyService::SanitizeUrlPolicy::SAFE
           : net::ProxyService::SanitizeUrlPolicy::UNSAFE);
 #if defined(OS_CHROMEOS)
-  builder.set_dhcp_fetcher_factory(
+  builder->set_dhcp_fetcher_factory(
       base::MakeUnique<chromeos::DhcpProxyScriptFetcherFactoryChromeos>());
 #endif
-  builder.set_proxy_config_service(std::move(system_proxy_config_service_));
+  builder->set_proxy_config_service(std::move(system_proxy_config_service_));
 
-  builder.set_http_network_session_params(session_params_);
+  builder->set_http_network_session_params(session_params_);
 
-  builder.set_data_enabled(true);
-  builder.set_file_enabled(true);
+  builder->set_data_enabled(true);
+  builder->set_file_enabled(true);
 #if !BUILDFLAG(DISABLE_FTP_SUPPORT)
-  builder.set_ftp_enabled(true);
+  builder->set_ftp_enabled(true);
 #endif
 
-  builder.DisableHttpCache();
+  builder->DisableHttpCache();
 
-  globals_->system_request_context = builder.Build();
+  globals_->network_service = content::NetworkService::Create();
+  globals_->system_network_context =
+      globals_->network_service->CreateNetworkContextWithBuilder(
+          std::move(network_context_request_),
+          std::move(network_context_params_), std::move(builder),
+          &globals_->system_request_context);
 
 #if defined(USE_NSS_CERTS)
-  net::SetURLRequestContextForNSSHttpIO(globals_->system_request_context.get());
+  net::SetURLRequestContextForNSSHttpIO(globals_->system_request_context);
 #endif
 #if defined(OS_ANDROID)
   net::CertVerifyProcAndroid::SetCertNetFetcher(
-      net::CreateCertNetFetcher(globals_->system_request_context.get()));
+      net::CreateCertNetFetcher(globals_->system_request_context));
 #endif
 }
 
diff --git a/chrome/browser/io_thread.h b/chrome/browser/io_thread.h
index e250176..593491b 100644
--- a/chrome/browser/io_thread.h
+++ b/chrome/browser/io_thread.h
@@ -23,12 +23,15 @@
 #include "base/time/time.h"
 #include "build/build_config.h"
 #include "chrome/browser/net/chrome_network_delegate.h"
+#include "chrome/browser/net/system_network_context_manager.h"
 #include "chrome/common/features.h"
 #include "components/metrics/data_use_tracker.h"
 #include "components/prefs/pref_member.h"
 #include "components/ssl_config/ssl_config_service_manager.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/browser_thread_delegate.h"
+#include "content/public/common/network_service.mojom.h"
+#include "content/public/network/network_service.h"
 #include "extensions/features/features.h"
 #include "net/base/network_change_notifier.h"
 #include "net/http/http_network_session.h"
@@ -127,6 +130,11 @@
     Globals();
     ~Globals();
 
+    // In-process NetworkService for use in URLRequestContext configuration when
+    // the network service created through the ServiceManager is disabled. See
+    // SystemNetworkContextManager's header comment for more details
+    std::unique_ptr<content::NetworkService> network_service;
+
     // Ascribes all data use in Chrome to a source, such as page loads.
     std::unique_ptr<data_use_measurement::ChromeDataUseAscriber>
         data_use_ascriber;
@@ -140,7 +148,8 @@
 #endif  // defined(OS_ANDROID)
     std::vector<scoped_refptr<const net::CTLogVerifier>> ct_logs;
     std::unique_ptr<net::HttpAuthPreferences> http_auth_preferences;
-    std::unique_ptr<net::URLRequestContext> system_request_context;
+    std::unique_ptr<content::mojom::NetworkContext> system_network_context;
+    net::URLRequestContext* system_request_context;
     SystemRequestContextLeakChecker system_request_context_leak_checker;
 #if BUILDFLAG(ENABLE_EXTENSIONS)
     scoped_refptr<extensions::EventRouterForwarder>
@@ -323,6 +332,11 @@
   bool allow_gssapi_library_load_;
 #endif
 
+  // These are set on the UI thread, and then consumed during initialization on
+  // the IO thread.
+  content::mojom::NetworkContextRequest network_context_request_;
+  content::mojom::NetworkContextParamsPtr network_context_params_;
+
   // This is an instance of the default SSLConfigServiceManager for the current
   // platform and it gets SSL preferences from local_state object.
   std::unique_ptr<ssl_config::SSLConfigServiceManager>
diff --git a/chrome/browser/metrics/thread_watcher.cc b/chrome/browser/metrics/thread_watcher.cc
index d0d4b7d..65f4e57 100644
--- a/chrome/browser/metrics/thread_watcher.cc
+++ b/chrome/browser/metrics/thread_watcher.cc
@@ -29,10 +29,6 @@
 #include "components/version_info/version_info.h"
 #include "content/public/browser/notification_service.h"
 
-#if defined(OS_WIN)
-#include "base/win/windows_version.h"
-#endif
-
 using content::BrowserThread;
 
 // ThreadWatcher methods and members.
@@ -454,14 +450,6 @@
     *unresponsive_threshold *= 2;
   }
 
-#if defined(OS_WIN)
-  // For Windows XP (old systems), double the unresponsive_threshold to give
-  // the OS a chance to schedule UI/IO threads a time slice to respond with a
-  // pong message (to get around limitations with the OS).
-  if (base::win::GetVersion() <= base::win::VERSION_XP)
-    *unresponsive_threshold *= 2;
-#endif
-
   uint32_t crash_seconds = *unresponsive_threshold * kUnresponsiveSeconds;
   std::string crash_on_hang_thread_names;
   if (command_line.HasSwitch(switches::kCrashOnHangThreads)) {
@@ -949,12 +937,6 @@
     actual_duration *= 2;
   }
 
-#if defined(OS_WIN)
-  // On Windows XP, give twice the time for shutdown.
-  if (base::win::GetVersion() <= base::win::VERSION_XP)
-    actual_duration *= 2;
-#endif
-
   shutdown_watchdog_ = new ShutdownWatchDogThread(actual_duration);
   shutdown_watchdog_->Arm();
 }
diff --git a/chrome/browser/net/net_error_diagnostics_dialog_win.cc b/chrome/browser/net/net_error_diagnostics_dialog_win.cc
index c693c68..ec33fed 100644
--- a/chrome/browser/net/net_error_diagnostics_dialog_win.cc
+++ b/chrome/browser/net/net_error_diagnostics_dialog_win.cc
@@ -24,7 +24,6 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/task_runner.h"
 #include "base/threading/thread.h"
-#include "base/win/windows_version.h"
 #include "content/public/browser/web_contents.h"
 #include "ui/gfx/native_widget_types.h"
 #include "ui/shell_dialogs/base_shell_dialog_win.h"
@@ -80,10 +79,7 @@
 }  // namespace
 
 bool CanShowNetworkDiagnosticsDialog() {
-  // Not present on XP and Windows 2003.
-  // TODO(mmenke): Remove this logic once Chrome requires Vista or later.
-  return base::win::OSInfo::GetInstance()->version() >=
-         base::win::VERSION_VISTA;
+  return true;
 }
 
 void ShowNetworkDiagnosticsDialog(content::WebContents* web_contents,
diff --git a/chrome/browser/net/system_network_context_manager.cc b/chrome/browser/net/system_network_context_manager.cc
new file mode 100644
index 0000000..4b940b1c1
--- /dev/null
+++ b/chrome/browser/net/system_network_context_manager.cc
@@ -0,0 +1,63 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/net/system_network_context_manager.h"
+
+#include "base/feature_list.h"
+#include "base/logging.h"
+#include "content/public/browser/browser_thread.h"
+#include "content/public/browser/network_service_instance.h"
+#include "content/public/common/content_features.h"
+#include "content/public/common/service_names.mojom.h"
+#include "mojo/public/cpp/bindings/associated_interface_ptr.h"
+
+namespace {
+
+content::mojom::NetworkContextParamsPtr CreateNetworkContextParams() {
+  // TODO(mmenke): Set up parameters here (No cache, in memory cookie store,
+  // etc).
+  return content::mojom::NetworkContextParams::New();
+}
+
+}  // namespace
+
+base::LazyInstance<SystemNetworkContextManager>::Leaky
+    g_system_network_context_manager = LAZY_INSTANCE_INITIALIZER;
+
+content::mojom::NetworkContext* SystemNetworkContextManager::Context() {
+  return GetInstance()->GetContext();
+}
+
+void SystemNetworkContextManager::SetUp(
+    content::mojom::NetworkContextRequest* network_context_request,
+    content::mojom::NetworkContextParamsPtr* network_context_params) {
+  DCHECK(!GetInstance()->io_thread_network_context_);
+  *network_context_request =
+      mojo::MakeRequest(&GetInstance()->io_thread_network_context_);
+  *network_context_params = CreateNetworkContextParams();
+}
+
+SystemNetworkContextManager* SystemNetworkContextManager::GetInstance() {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+  return g_system_network_context_manager.Pointer();
+}
+
+SystemNetworkContextManager::SystemNetworkContextManager() {}
+
+SystemNetworkContextManager::~SystemNetworkContextManager() {}
+
+content::mojom::NetworkContext* SystemNetworkContextManager::GetContext() {
+  if (!base::FeatureList::IsEnabled(features::kNetworkService)) {
+    // SetUp should already have been called.
+    DCHECK(io_thread_network_context_);
+    return io_thread_network_context_.get();
+  }
+
+  if (!network_service_network_context_) {
+    content::GetNetworkService()->CreateNetworkContext(
+        MakeRequest(&network_service_network_context_),
+        CreateNetworkContextParams());
+  }
+  return network_service_network_context_.get();
+}
diff --git a/chrome/browser/net/system_network_context_manager.h b/chrome/browser/net/system_network_context_manager.h
new file mode 100644
index 0000000..b3003c2
--- /dev/null
+++ b/chrome/browser/net/system_network_context_manager.h
@@ -0,0 +1,72 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_NET_SYSTEM_NETWORK_CONTEXT_MANAGER_H_
+#define CHROME_BROWSER_NET_SYSTEM_NETWORK_CONTEXT_MANAGER_H_
+
+#include <memory>
+
+#include "base/lazy_instance.h"
+#include "base/macros.h"
+#include "content/public/common/network_service.mojom.h"
+
+// Global object that lives on the UI thread. Responsible for creating and
+// managing access to the system NetworkContext. This NetworkContext is intended
+// for requests not associated with a profile. It stores no data on disk, and
+// has no HTTP cache, but it does have ephemeral cookie and channel ID stores.
+// It also does not have access to HTTP proxy auth information the user has
+// entered or that comes from extensions, and similarly, has no
+// extension-provided per-profile proxy configuration information.
+//
+// The "system" NetworkContext will either share a URLRequestContext with
+// IOThread's SystemURLRequestContext and be part of IOThread's NetworkService
+// (If the network service is disabled) or be an independent NetworkContext
+// using the actual network service.
+//
+// This class is intended to eventually replace IOThread. Handling the two cases
+// differently allows this to be used in production without breaking anything or
+// requiring two separate paths, while IOThread consumers slowly transition over
+// to being compatible with the network service.
+class SystemNetworkContextManager {
+ public:
+  // Initializes |network_context_params| as needed to set up a system
+  // NetworkContext. If the network service is disabled,
+  // |network_context_request| will be for the NetworkContext used by the
+  // SystemNetworkContextManager. Otherwise, this method can still be used to
+  // help set up the IOThread's in-process URLRequestContext, and
+  // |network_context_request| will still be populated, but the associated
+  // NetworkContext will not be used by the SystemNetworkContextManager.
+  //
+  // Must be called before the system NetworkContext is first used.
+  static void SetUp(
+      content::mojom::NetworkContextRequest* network_context_request,
+      content::mojom::NetworkContextParamsPtr* network_context_params);
+
+  // Returns the System NetworkContext. May only be called after SetUp().
+  static content::mojom::NetworkContext* Context();
+
+ private:
+  static SystemNetworkContextManager* GetInstance();
+
+  friend struct base::LazyInstanceTraitsBase<SystemNetworkContextManager>;
+
+  SystemNetworkContextManager();
+  ~SystemNetworkContextManager();
+
+  // Gets the system NetworkContext, creating it if needed.
+  content::mojom::NetworkContext* GetContext();
+
+  // NetworkContext using the network service, if the/ network service is
+  // enabled. nullptr, otherwise.
+  content::mojom::NetworkContextPtr network_service_network_context_;
+
+  // This is a NetworkContext that wraps the IOThread's SystemURLRequestContext.
+  // Always initialized in SetUp, but it's only returned by Context() when the
+  // network service is disabled.
+  content::mojom::NetworkContextPtr io_thread_network_context_;
+
+  DISALLOW_COPY_AND_ASSIGN(SystemNetworkContextManager);
+};
+
+#endif  // CHROME_BROWSER_NET_SYSTEM_NETWORK_CONTEXT_MANAGER_H_
diff --git a/chrome/browser/net/system_network_context_manager_browsertest.cc b/chrome/browser/net/system_network_context_manager_browsertest.cc
new file mode 100644
index 0000000..607bd658
--- /dev/null
+++ b/chrome/browser/net/system_network_context_manager_browsertest.cc
@@ -0,0 +1,91 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/net/system_network_context_manager.h"
+
+#include "base/test/scoped_feature_list.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "content/public/common/content_features.h"
+#include "content/public/common/content_switches.h"
+#include "content/public/common/network_service.mojom.h"
+#include "content/public/common/resource_response.h"
+#include "content/public/common/resource_response_info.h"
+#include "content/public/common/url_loader.mojom.h"
+#include "content/public/common/url_loader_factory.mojom.h"
+#include "content/public/test/test_url_loader_client.h"
+#include "mojo/common/data_pipe_utils.h"
+#include "net/base/net_errors.h"
+#include "net/http/http_response_headers.h"
+#include "net/test/embedded_test_server/embedded_test_server.h"
+#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
+
+namespace {
+
+enum class NetworkServiceState {
+  kDisabled,
+  kEnabled,
+};
+
+class SystemNetworkContextManagerTest
+    : public InProcessBrowserTest,
+      public testing::WithParamInterface<NetworkServiceState> {
+ public:
+  SystemNetworkContextManagerTest() {
+    EXPECT_TRUE(embedded_test_server()->Start());
+  }
+
+  ~SystemNetworkContextManagerTest() override {}
+
+  void SetUpInProcessBrowserTestFixture() override {
+    feature_list_.InitAndEnableFeature(features::kNetworkService);
+  }
+
+  void SetUpOnMainThread() override {
+    SystemNetworkContextManager::Context()->CreateURLLoaderFactory(
+        MakeRequest(&loader_factory_), 0);
+  }
+
+  content::mojom::URLLoaderFactory* loader_factory() {
+    return loader_factory_.get();
+  }
+
+ private:
+  content::mojom::URLLoaderFactoryPtr loader_factory_;
+  base::test::ScopedFeatureList feature_list_;
+};
+
+IN_PROC_BROWSER_TEST_P(SystemNetworkContextManagerTest, BasicRequest) {
+  content::mojom::URLLoaderAssociatedPtr loader;
+  content::ResourceRequest request;
+  content::TestURLLoaderClient client;
+  request.url = embedded_test_server()->GetURL("/echo");
+  request.method = "GET";
+  request.request_initiator = url::Origin();
+  loader_factory()->CreateLoaderAndStart(
+      mojo::MakeRequest(&loader), 2, 1, content::mojom::kURLLoadOptionNone,
+      request, client.CreateInterfacePtr(),
+      net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
+  client.RunUntilResponseReceived();
+  ASSERT_TRUE(client.response_head().headers);
+  EXPECT_EQ(200, client.response_head().headers->response_code());
+
+  client.RunUntilResponseBodyArrived();
+  // TODO(mmenke):  Is blocking the UI Thread while reading the response really
+  // the best way to test requests in a browser test?
+  std::string response_body;
+  EXPECT_TRUE(mojo::common::BlockingCopyToString(client.response_body_release(),
+                                                 &response_body));
+  EXPECT_EQ("Echo", response_body);
+
+  client.RunUntilComplete();
+  EXPECT_EQ(net::OK, client.completion_status().error_code);
+}
+
+INSTANTIATE_TEST_CASE_P(
+    /* no prefix */,
+    SystemNetworkContextManagerTest,
+    ::testing::Values(NetworkServiceState::kDisabled,
+                      NetworkServiceState::kEnabled));
+
+}  // namespace
diff --git a/chrome/browser/password_manager/native_backend_gnome_x.cc b/chrome/browser/password_manager/native_backend_gnome_x.cc
index 9418e71..ea3e501 100644
--- a/chrome/browser/password_manager/native_backend_gnome_x.cc
+++ b/chrome/browser/password_manager/native_backend_gnome_x.cc
@@ -19,6 +19,7 @@
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/synchronization/waitable_event.h"
+#include "base/task_scheduler/post_task.h"
 #include "base/time/time.h"
 #include "components/autofill/core/common/password_form.h"
 #include "components/password_manager/core/browser/password_manager_metrics_util.h"
@@ -29,7 +30,6 @@
 using autofill::PasswordForm;
 using base::UTF8ToUTF16;
 using base::UTF16ToUTF8;
-using content::BrowserThread;
 using namespace password_manager::metrics_util;
 using password_manager::MatchResult;
 using password_manager::PasswordStore;
@@ -218,8 +218,11 @@
 // be used in parallel.
 class GKRMethod : public GnomeKeyringLoader {
  public:
-  GKRMethod()
-      : event_(base::WaitableEvent::ResetPolicy::AUTOMATIC,
+  GKRMethod(scoped_refptr<base::SequencedTaskRunner> main_task_runner,
+            scoped_refptr<base::SequencedTaskRunner> background_task_runner)
+      : main_task_runner_(std::move(main_task_runner)),
+        background_task_runner_(std::move(background_task_runner)),
+        event_(base::WaitableEvent::ResetPolicy::AUTOMATIC,
                base::WaitableEvent::InitialState::NOT_SIGNALED),
         result_(GNOME_KEYRING_RESULT_CANCELLED) {}
 
@@ -272,6 +275,8 @@
   static void OnOperationGetList(GnomeKeyringResult result, GList* list,
                                  gpointer data);
 
+  scoped_refptr<base::SequencedTaskRunner> main_task_runner_;
+  scoped_refptr<base::SequencedTaskRunner> background_task_runner_;
   base::WaitableEvent event_;
   GnomeKeyringResult result_;
   std::vector<std::unique_ptr<PasswordForm>> forms_;
@@ -286,7 +291,7 @@
 };
 
 void GKRMethod::AddLogin(const PasswordForm& form, const char* app_string) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  DCHECK(main_task_runner_->RunsTasksInCurrentSequence());
   int64_t date_created = form.date_created.ToInternalValue();
   // If we are asked to save a password with 0 date, use the current time.
   // We don't want to actually save passwords as though on January 1, 1601.
@@ -334,7 +339,7 @@
 
 void GKRMethod::LoginSearch(const PasswordForm& form,
                                const char* app_string) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  DCHECK(main_task_runner_->RunsTasksInCurrentSequence());
   lookup_form_.reset(nullptr);
   // Search GNOME Keyring for matching passwords to update.
   ScopedAttributeList attrs(gnome_keyring_attribute_list_new_ptr());
@@ -351,7 +356,7 @@
 }
 
 void GKRMethod::RemoveLogin(const PasswordForm& form, const char* app_string) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  DCHECK(main_task_runner_->RunsTasksInCurrentSequence());
   // We find forms using the same fields as LoginDatabase::RemoveLogin().
   gnome_keyring_delete_password_ptr(
       &kGnomeSchema,
@@ -369,7 +374,7 @@
 
 void GKRMethod::GetLogins(const PasswordStore::FormDigest& form,
                           const char* app_string) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  DCHECK(main_task_runner_->RunsTasksInCurrentSequence());
   lookup_form_.reset(new PasswordStore::FormDigest(form));
   // Search GNOME Keyring for matching passwords.
   ScopedAttributeList attrs(gnome_keyring_attribute_list_new_ptr());
@@ -389,7 +394,7 @@
 
 void GKRMethod::GetLoginsList(uint32_t blacklisted_by_user,
                               const char* app_string) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  DCHECK(main_task_runner_->RunsTasksInCurrentSequence());
   lookup_form_.reset(nullptr);
   // Search GNOME Keyring for matching passwords.
   ScopedAttributeList attrs(gnome_keyring_attribute_list_new_ptr());
@@ -402,7 +407,7 @@
 }
 
 void GKRMethod::GetAllLogins(const char* app_string) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  DCHECK(main_task_runner_->RunsTasksInCurrentSequence());
   lookup_form_.reset(nullptr);
   // We need to search for something, otherwise we get no results - so
   // we search for the fixed application string.
@@ -415,14 +420,14 @@
 }
 
 GnomeKeyringResult GKRMethod::WaitResult() {
-  DCHECK_CURRENTLY_ON(BrowserThread::DB);
+  DCHECK(background_task_runner_->RunsTasksInCurrentSequence());
   event_.Wait();
   return result_;
 }
 
 GnomeKeyringResult GKRMethod::WaitResult(
     std::vector<std::unique_ptr<PasswordForm>>* forms) {
-  DCHECK_CURRENTLY_ON(BrowserThread::DB);
+  DCHECK(background_task_runner_->RunsTasksInCurrentSequence());
   event_.Wait();
   *forms = std::move(forms_);
   return result_;
@@ -480,9 +485,23 @@
 
 }  // namespace
 
+// This uses BrowserThread::UI for the main thread, because the Gnome Keyring
+// library needs to run there (see the comment at the top of this file).
+// This also uses USER_VISIBLE priority for the background task runner, because
+// the passwords obtained through tasks on the background runner influence what
+// the user sees. The need for WithBaseSyncPrimitives is caused by calls to
+// Wait() to synchronise the background task with its response from
+// GnomeKeyring which needs to be produced on the main task runner for library
+// limitations. While unfortunate, https://crbug.com/739897 provides the
+// discussion which resulted in accepting this until the whole backend is
+// deprecated.
 NativeBackendGnome::NativeBackendGnome(LocalProfileId id)
-    : app_string_(GetProfileSpecificAppString(id)) {
-}
+    : app_string_(GetProfileSpecificAppString(id)),
+      main_task_runner_(content::BrowserThread::GetTaskRunnerForThread(
+          content::BrowserThread::UI)),
+      background_task_runner_(base::CreateSequencedTaskRunnerWithTraits(
+          {base::MayBlock(), base::WithBaseSyncPrimitives(),
+           base::TaskPriority::USER_VISIBLE})) {}
 
 NativeBackendGnome::~NativeBackendGnome() {
 }
@@ -492,12 +511,11 @@
 }
 
 bool NativeBackendGnome::RawAddLogin(const PasswordForm& form) {
-  DCHECK_CURRENTLY_ON(BrowserThread::DB);
-  GKRMethod method;
-  BrowserThread::PostTask(
-      BrowserThread::UI, FROM_HERE,
-      base::BindOnce(&GKRMethod::AddLogin, base::Unretained(&method), form,
-                     app_string_.c_str()));
+  DCHECK(background_task_runner_->RunsTasksInCurrentSequence());
+  GKRMethod method(main_task_runner_, background_task_runner_);
+  main_task_runner_->PostTask(
+      FROM_HERE, base::BindOnce(&GKRMethod::AddLogin, base::Unretained(&method),
+                                form, app_string_.c_str()));
   GnomeKeyringResult result = method.WaitResult();
   if (result != GNOME_KEYRING_RESULT_OK) {
     LOG(ERROR) << "Keyring save failed: "
@@ -514,10 +532,10 @@
   // element, and signon_realm first, remove that, and then add the new entry.
   // We'd add the new one first, and then delete the original, but then the
   // delete might actually delete the newly-added entry!
-  DCHECK_CURRENTLY_ON(BrowserThread::DB);
-  GKRMethod method;
-  BrowserThread::PostTask(
-      BrowserThread::UI, FROM_HERE,
+  DCHECK(background_task_runner_->RunsTasksInCurrentSequence());
+  GKRMethod method(main_task_runner_, background_task_runner_);
+  main_task_runner_->PostTask(
+      FROM_HERE,
       base::BindOnce(&GKRMethod::LoginSearch, base::Unretained(&method), form,
                      app_string_.c_str()));
   std::vector<std::unique_ptr<PasswordForm>> forms;
@@ -558,11 +576,11 @@
   // differ in any of the mutable fields, then we remove the original, and
   // then add the new entry. We'd add the new one first, and then delete the
   // original, but then the delete might actually delete the newly-added entry!
-  DCHECK_CURRENTLY_ON(BrowserThread::DB);
+  DCHECK(background_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(changes);
-  GKRMethod method;
-  BrowserThread::PostTask(
-      BrowserThread::UI, FROM_HERE,
+  GKRMethod method(main_task_runner_, background_task_runner_);
+  main_task_runner_->PostTask(
+      FROM_HERE,
       base::BindOnce(&GKRMethod::LoginSearch, base::Unretained(&method), form,
                      app_string_.c_str()));
   std::vector<std::unique_ptr<PasswordForm>> forms;
@@ -598,11 +616,11 @@
 bool NativeBackendGnome::RemoveLogin(
     const PasswordForm& form,
     password_manager::PasswordStoreChangeList* changes) {
-  DCHECK_CURRENTLY_ON(BrowserThread::DB);
+  DCHECK(background_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(changes);
-  GKRMethod method;
-  BrowserThread::PostTask(
-      BrowserThread::UI, FROM_HERE,
+  GKRMethod method(main_task_runner_, background_task_runner_);
+  main_task_runner_->PostTask(
+      FROM_HERE,
       base::BindOnce(&GKRMethod::RemoveLogin, base::Unretained(&method), form,
                      app_string_.c_str()));
   GnomeKeyringResult result = method.WaitResult();
@@ -655,10 +673,10 @@
 bool NativeBackendGnome::GetLogins(
     const PasswordStore::FormDigest& form,
     std::vector<std::unique_ptr<PasswordForm>>* forms) {
-  DCHECK_CURRENTLY_ON(BrowserThread::DB);
-  GKRMethod method;
-  BrowserThread::PostTask(
-      BrowserThread::UI, FROM_HERE,
+  DCHECK(background_task_runner_->RunsTasksInCurrentSequence());
+  GKRMethod method(main_task_runner_, background_task_runner_);
+  main_task_runner_->PostTask(
+      FROM_HERE,
       base::BindOnce(&GKRMethod::GetLogins, base::Unretained(&method), form,
                      app_string_.c_str()));
   GnomeKeyringResult result = method.WaitResult(forms);
@@ -685,13 +703,13 @@
 bool NativeBackendGnome::GetLoginsList(
     bool autofillable,
     std::vector<std::unique_ptr<PasswordForm>>* forms) {
-  DCHECK_CURRENTLY_ON(BrowserThread::DB);
+  DCHECK(background_task_runner_->RunsTasksInCurrentSequence());
 
   uint32_t blacklisted_by_user = !autofillable;
 
-  GKRMethod method;
-  BrowserThread::PostTask(
-      BrowserThread::UI, FROM_HERE,
+  GKRMethod method(main_task_runner_, background_task_runner_);
+  main_task_runner_->PostTask(
+      FROM_HERE,
       base::BindOnce(&GKRMethod::GetLoginsList, base::Unretained(&method),
                      blacklisted_by_user, app_string_.c_str()));
   GnomeKeyringResult result = method.WaitResult(forms);
@@ -724,9 +742,10 @@
 
 bool NativeBackendGnome::GetAllLogins(
     std::vector<std::unique_ptr<PasswordForm>>* forms) {
-  GKRMethod method;
-  BrowserThread::PostTask(
-      BrowserThread::UI, FROM_HERE,
+  DCHECK(background_task_runner_->RunsTasksInCurrentSequence());
+  GKRMethod method(main_task_runner_, background_task_runner_);
+  main_task_runner_->PostTask(
+      FROM_HERE,
       base::BindOnce(&GKRMethod::GetAllLogins, base::Unretained(&method),
                      app_string_.c_str()));
   GnomeKeyringResult result = method.WaitResult(forms);
@@ -740,12 +759,17 @@
   return true;
 }
 
+scoped_refptr<base::SequencedTaskRunner>
+NativeBackendGnome::GetBackgroundTaskRunner() {
+  return background_task_runner_;
+}
+
 bool NativeBackendGnome::GetLoginsBetween(
     base::Time get_begin,
     base::Time get_end,
     TimestampToCompare date_to_compare,
     std::vector<std::unique_ptr<PasswordForm>>* forms) {
-  DCHECK_CURRENTLY_ON(BrowserThread::DB);
+  DCHECK(background_task_runner_->RunsTasksInCurrentSequence());
   forms->clear();
   // We could walk the list and add items as we find them, but it is much
   // easier to build the list and then filter the results.
@@ -771,7 +795,7 @@
     base::Time get_end,
     TimestampToCompare date_to_compare,
     password_manager::PasswordStoreChangeList* changes) {
-  DCHECK_CURRENTLY_ON(BrowserThread::DB);
+  DCHECK(background_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(changes);
   changes->clear();
   // We could walk the list and delete items as we find them, but it is much
diff --git a/chrome/browser/password_manager/native_backend_gnome_x.h b/chrome/browser/password_manager/native_backend_gnome_x.h
index 9780194..e8760c6 100644
--- a/chrome/browser/password_manager/native_backend_gnome_x.h
+++ b/chrome/browser/password_manager/native_backend_gnome_x.h
@@ -11,6 +11,8 @@
 
 #include "base/compiler_specific.h"
 #include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "base/sequenced_task_runner.h"
 #include "base/time/time.h"
 #include "chrome/browser/password_manager/password_store_factory.h"
 #include "chrome/browser/password_manager/password_store_x.h"
@@ -58,6 +60,7 @@
       std::vector<std::unique_ptr<autofill::PasswordForm>>* forms) override;
   bool GetAllLogins(
       std::vector<std::unique_ptr<autofill::PasswordForm>>* forms) override;
+  scoped_refptr<base::SequencedTaskRunner> GetBackgroundTaskRunner() override;
 
  private:
   enum TimestampToCompare {
@@ -93,6 +96,9 @@
   // The app string, possibly based on the local profile id.
   std::string app_string_;
 
+  scoped_refptr<base::SequencedTaskRunner> main_task_runner_;
+  scoped_refptr<base::SequencedTaskRunner> background_task_runner_;
+
   DISALLOW_COPY_AND_ASSIGN(NativeBackendGnome);
 };
 
diff --git a/chrome/browser/password_manager/native_backend_gnome_x_unittest.cc b/chrome/browser/password_manager/native_backend_gnome_x_unittest.cc
index 855d6595..61ef231d 100644
--- a/chrome/browser/password_manager/native_backend_gnome_x_unittest.cc
+++ b/chrome/browser/password_manager/native_backend_gnome_x_unittest.cc
@@ -15,6 +15,8 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/task_runner_util.h"
+#include "base/test/scoped_task_environment.h"
 #include "base/time/time.h"
 #include "chrome/browser/password_manager/native_backend_gnome_x.h"
 #include "chrome/test/base/testing_profile.h"
@@ -22,7 +24,6 @@
 #include "components/password_manager/core/browser/psl_matching_helper.h"
 #include "components/password_manager/core/common/password_manager_pref_names.h"
 #include "components/prefs/pref_service.h"
-#include "content/public/browser/browser_thread.h"
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "content/public/test/test_utils.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -31,7 +32,6 @@
 using autofill::PasswordForm;
 using base::UTF8ToUTF16;
 using base::UTF16ToUTF8;
-using content::BrowserThread;
 using password_manager::PasswordStore;
 using password_manager::PasswordStoreChange;
 using password_manager::PasswordStoreChangeList;
@@ -359,8 +359,8 @@
   };
 
   NativeBackendGnomeTest()
-      : test_browser_thread_bundle_(
-            content::TestBrowserThreadBundle::REAL_DB_THREAD) {}
+      : scoped_task_environment_(
+            base::test::ScopedTaskEnvironment::MainThreadType::UI) {}
 
   void SetUp() override {
     ASSERT_TRUE(MockGnomeKeyringLoader::LoadMockGnomeKeyring());
@@ -500,8 +500,8 @@
     NativeBackendGnome backend(321);
     backend.Init();
 
-    BrowserThread::PostTask(
-        BrowserThread::DB, FROM_HERE,
+    backend.GetBackgroundTaskRunner()->PostTask(
+        FROM_HERE,
         base::BindOnce(base::IgnoreResult(&NativeBackendGnome::AddLogin),
                        base::Unretained(&backend), credentials));
 
@@ -513,16 +513,13 @@
       target_form.signon_realm.append("Realm");
     }
     std::vector<std::unique_ptr<PasswordForm>> form_list;
-    BrowserThread::PostTaskAndReplyWithResult(
-        BrowserThread::DB,
-        FROM_HERE,
-        base::Bind(&NativeBackendGnome::GetLogins,
-                   base::Unretained(&backend),
-                   target_form,
-                   &form_list),
+    base::PostTaskAndReplyWithResult(
+        backend.GetBackgroundTaskRunner().get(), FROM_HERE,
+        base::Bind(&NativeBackendGnome::GetLogins, base::Unretained(&backend),
+                   target_form, &form_list),
         base::Bind(&CheckTrue));
 
-    content::RunAllPendingInMessageLoop(BrowserThread::DB);
+    scoped_task_environment_.RunUntilIdle();
 
     EXPECT_EQ(1u, mock_keyring_items.size());
     if (mock_keyring_items.size() > 0)
@@ -547,30 +544,28 @@
     backend.Init();
 
     // Add |form_facebook_| to saved logins.
-    BrowserThread::PostTaskAndReplyWithResult(
-        BrowserThread::DB,
-        FROM_HERE,
-        base::Bind(&NativeBackendGnome::AddLogin,
-                   base::Unretained(&backend),
+    base::PostTaskAndReplyWithResult(
+        backend.GetBackgroundTaskRunner().get(), FROM_HERE,
+        base::Bind(&NativeBackendGnome::AddLogin, base::Unretained(&backend),
                    form_facebook_),
         base::Bind(&CheckPasswordChanges,
-                   PasswordStoreChangeList(1, PasswordStoreChange(
-                       PasswordStoreChange::ADD, form_facebook_))));
+                   PasswordStoreChangeList(
+                       1, PasswordStoreChange(PasswordStoreChange::ADD,
+                                              form_facebook_))));
 
     // Get the PSL-matched copy of the saved login for m.facebook.
     const GURL kMobileURL("http://m.facebook.com/");
     PasswordStore::FormDigest m_facebook_lookup = {
         PasswordForm::SCHEME_HTML, kMobileURL.spec(), kMobileURL};
     std::vector<std::unique_ptr<PasswordForm>> form_list;
-    BrowserThread::PostTaskAndReplyWithResult(
-        BrowserThread::DB,
-        FROM_HERE,
-        base::Bind(&NativeBackendGnome::GetLogins,
-                   base::Unretained(&backend),
-                   m_facebook_lookup,
-                   &form_list),
+    base::PostTaskAndReplyWithResult(
+        backend.GetBackgroundTaskRunner().get(), FROM_HERE,
+        base::Bind(&NativeBackendGnome::GetLogins, base::Unretained(&backend),
+                   m_facebook_lookup, &form_list),
         base::Bind(&CheckTrue));
-    content::RunAllPendingInMessageLoop(BrowserThread::DB);
+
+    scoped_task_environment_.RunUntilIdle();
+
     EXPECT_EQ(1u, mock_keyring_items.size());
     EXPECT_EQ(1u, form_list.size());
     PasswordForm m_facebook = *form_list[0];
@@ -579,11 +574,13 @@
     m_facebook.signon_realm = kMobileURL.spec();
 
     // Add the PSL-matched copy to saved logins.
-    BrowserThread::PostTask(
-        BrowserThread::DB, FROM_HERE,
+    backend.GetBackgroundTaskRunner()->PostTask(
+        FROM_HERE,
         base::BindOnce(base::IgnoreResult(&NativeBackendGnome::AddLogin),
                        base::Unretained(&backend), m_facebook));
-    content::RunAllPendingInMessageLoop(BrowserThread::DB);
+
+    scoped_task_environment_.RunUntilIdle();
+
     EXPECT_EQ(2u, mock_keyring_items.size());
 
     // Update www.facebook.com login.
@@ -598,44 +595,39 @@
       case UPDATE_BY_UPDATELOGIN:
         expected_changes.push_back(
             PasswordStoreChange(PasswordStoreChange::UPDATE, new_facebook));
-        BrowserThread::PostTaskAndReplyWithResult(
-            BrowserThread::DB,
-            FROM_HERE,
+        base::PostTaskAndReplyWithResult(
+            backend.GetBackgroundTaskRunner().get(), FROM_HERE,
             base::Bind(&NativeBackendGnome::UpdateLogin,
-                       base::Unretained(&backend),
-                       new_facebook,
-                       &changes),
-            base::Bind(&CheckPasswordChangesWithResult,
-                       &expected_changes, &changes));
+                       base::Unretained(&backend), new_facebook, &changes),
+            base::Bind(&CheckPasswordChangesWithResult, &expected_changes,
+                       &changes));
         break;
       case UPDATE_BY_ADDLOGIN:
         expected_changes.push_back(
             PasswordStoreChange(PasswordStoreChange::REMOVE, form_facebook_));
         expected_changes.push_back(
             PasswordStoreChange(PasswordStoreChange::ADD, new_facebook));
-        BrowserThread::PostTaskAndReplyWithResult(
-            BrowserThread::DB,
-            FROM_HERE,
+        base::PostTaskAndReplyWithResult(
+            backend.GetBackgroundTaskRunner().get(), FROM_HERE,
             base::Bind(&NativeBackendGnome::AddLogin,
-                       base::Unretained(&backend),
-                       new_facebook),
+                       base::Unretained(&backend), new_facebook),
             base::Bind(&CheckPasswordChanges, expected_changes));
         break;
     }
 
-    content::RunAllPendingInMessageLoop(BrowserThread::DB);
+    scoped_task_environment_.RunUntilIdle();
+
     EXPECT_EQ(2u, mock_keyring_items.size());
 
     // Check that m.facebook.com login was not modified by the update.
-    BrowserThread::PostTaskAndReplyWithResult(
-        BrowserThread::DB,
-        FROM_HERE,
-        base::Bind(&NativeBackendGnome::GetLogins,
-                   base::Unretained(&backend),
-                   m_facebook_lookup,
-                   &form_list),
+    base::PostTaskAndReplyWithResult(
+        backend.GetBackgroundTaskRunner().get(), FROM_HERE,
+        base::Bind(&NativeBackendGnome::GetLogins, base::Unretained(&backend),
+                   m_facebook_lookup, &form_list),
         base::Bind(&CheckTrue));
-    content::RunAllPendingInMessageLoop(BrowserThread::DB);
+
+    scoped_task_environment_.RunUntilIdle();
+
     // There should be two results -- the exact one, and the PSL-matched one.
     EXPECT_EQ(2u, form_list.size());
     size_t index_non_psl = 0;
@@ -647,12 +639,14 @@
     form_list.clear();
 
     // Check that www.facebook.com login was modified by the update.
-    BrowserThread::PostTaskAndReplyWithResult(
-        BrowserThread::DB, FROM_HERE,
+    base::PostTaskAndReplyWithResult(
+        backend.GetBackgroundTaskRunner().get(), FROM_HERE,
         base::Bind(&NativeBackendGnome::GetLogins, base::Unretained(&backend),
                    PasswordStore::FormDigest(form_facebook_), &form_list),
         base::Bind(&CheckTrue));
-    content::RunAllPendingInMessageLoop(BrowserThread::DB);
+
+    scoped_task_environment_.RunUntilIdle();
+
     // There should be two results -- the exact one, and the PSL-matched one.
     EXPECT_EQ(2u, form_list.size());
     index_non_psl = 0;
@@ -700,12 +694,12 @@
       form_isc_.date_synced = next_day;
     }
 
-    BrowserThread::PostTask(
-        BrowserThread::DB, FROM_HERE,
+    backend.GetBackgroundTaskRunner()->PostTask(
+        FROM_HERE,
         base::BindOnce(base::IgnoreResult(&NativeBackendGnome::AddLogin),
                        base::Unretained(&backend), form_google_));
-    BrowserThread::PostTask(
-        BrowserThread::DB, FROM_HERE,
+    backend.GetBackgroundTaskRunner()->PostTask(
+        FROM_HERE,
         base::BindOnce(base::IgnoreResult(&NativeBackendGnome::AddLogin),
                        base::Unretained(&backend), form_isc_));
 
@@ -718,17 +712,14 @@
         date_to_test == CREATED
             ? &NativeBackendGnome::RemoveLoginsCreatedBetween
             : &NativeBackendGnome::RemoveLoginsSyncedBetween;
-    BrowserThread::PostTaskAndReplyWithResult(
-        BrowserThread::DB,
-        FROM_HERE,
-        base::Bind(method,
-                   base::Unretained(&backend),
-                   base::Time(),
-                   next_day,
+    base::PostTaskAndReplyWithResult(
+        backend.GetBackgroundTaskRunner().get(), FROM_HERE,
+        base::Bind(method, base::Unretained(&backend), base::Time(), next_day,
                    &changes),
-        base::Bind(
-            &CheckPasswordChangesWithResult, &expected_changes, &changes));
-    content::RunAllPendingInMessageLoop(BrowserThread::DB);
+        base::Bind(&CheckPasswordChangesWithResult, &expected_changes,
+                   &changes));
+
+    scoped_task_environment_.RunUntilIdle();
 
     EXPECT_EQ(1u, mock_keyring_items.size());
     if (mock_keyring_items.size() > 0)
@@ -738,21 +729,25 @@
     expected_changes.clear();
     expected_changes.push_back(
         PasswordStoreChange(PasswordStoreChange::REMOVE, form_isc_));
-    BrowserThread::PostTaskAndReplyWithResult(
-        BrowserThread::DB,
-        FROM_HERE,
-        base::Bind(method,
-                   base::Unretained(&backend),
-                   next_day,
-                   base::Time(),
+    base::PostTaskAndReplyWithResult(
+        backend.GetBackgroundTaskRunner().get(), FROM_HERE,
+        base::Bind(method, base::Unretained(&backend), next_day, base::Time(),
                    &changes),
-        base::Bind(
-            &CheckPasswordChangesWithResult, &expected_changes, &changes));
-    content::RunAllPendingInMessageLoop(BrowserThread::DB);
+        base::Bind(&CheckPasswordChangesWithResult, &expected_changes,
+                   &changes));
+
+    scoped_task_environment_.RunUntilIdle();
 
     EXPECT_EQ(0u, mock_keyring_items.size());
   }
 
+  // Create the ScopedTaskEnvirnment first to ensure that
+  // CreateSequencedTaskRunnerWithTraits will work correctly. Then create also
+  // TestBrowserThreadBundle so that BrowserThread::UI has an associated
+  // TaskRunner. The order is important because the bundle can detect that the
+  // MessageLoop used by the environment exists and reuse it, but not vice
+  // versa.
+  base::test::ScopedTaskEnvironment scoped_task_environment_;
   content::TestBrowserThreadBundle test_browser_thread_bundle_;
 
   // Provide some test forms to avoid having to set them up in each test.
@@ -766,15 +761,16 @@
   NativeBackendGnome backend(42);
   backend.Init();
 
-  BrowserThread::PostTaskAndReplyWithResult(
-      BrowserThread::DB, FROM_HERE,
-      base::Bind(&NativeBackendGnome::AddLogin,
-                 base::Unretained(&backend), form_google_),
-      base::Bind(&CheckPasswordChanges,
-                 PasswordStoreChangeList(1, PasswordStoreChange(
-                     PasswordStoreChange::ADD, form_google_))));
+  base::PostTaskAndReplyWithResult(
+      backend.GetBackgroundTaskRunner().get(), FROM_HERE,
+      base::Bind(&NativeBackendGnome::AddLogin, base::Unretained(&backend),
+                 form_google_),
+      base::Bind(
+          &CheckPasswordChanges,
+          PasswordStoreChangeList(
+              1, PasswordStoreChange(PasswordStoreChange::ADD, form_google_))));
 
-  content::RunAllPendingInMessageLoop(BrowserThread::DB);
+  scoped_task_environment_.RunUntilIdle();
 
   EXPECT_EQ(1u, mock_keyring_items.size());
   if (mock_keyring_items.size() > 0)
@@ -785,19 +781,19 @@
   NativeBackendGnome backend(42);
   backend.Init();
 
-  BrowserThread::PostTask(
-      BrowserThread::DB, FROM_HERE,
+  backend.GetBackgroundTaskRunner()->PostTask(
+      FROM_HERE,
       base::BindOnce(base::IgnoreResult(&NativeBackendGnome::AddLogin),
                      base::Unretained(&backend), form_google_));
 
   std::vector<std::unique_ptr<PasswordForm>> form_list;
-  BrowserThread::PostTaskAndReplyWithResult(
-      BrowserThread::DB, FROM_HERE,
+  base::PostTaskAndReplyWithResult(
+      backend.GetBackgroundTaskRunner().get(), FROM_HERE,
       base::Bind(&NativeBackendGnome::GetAutofillableLogins,
                  base::Unretained(&backend), &form_list),
       base::Bind(&CheckTrue));
 
-  content::RunAllPendingInMessageLoop(BrowserThread::DB);
+  scoped_task_environment_.RunUntilIdle();
 
   // Quick check that we got something back.
   EXPECT_EQ(1u, form_list.size());
@@ -899,12 +895,12 @@
   backend.Init();
 
   // First add google login.
-  BrowserThread::PostTask(
-      BrowserThread::DB, FROM_HERE,
+  backend.GetBackgroundTaskRunner()->PostTask(
+      FROM_HERE,
       base::BindOnce(base::IgnoreResult(&NativeBackendGnome::AddLogin),
                      base::Unretained(&backend), form_google_));
 
-  content::RunAllPendingInMessageLoop(BrowserThread::DB);
+  scoped_task_environment_.RunUntilIdle();
 
   PasswordForm new_form_google(form_google_);
   new_form_google.times_used = 1;
@@ -918,14 +914,13 @@
   PasswordStoreChangeList changes;
   PasswordStoreChangeList expected_changes(
       1, PasswordStoreChange(PasswordStoreChange::UPDATE, new_form_google));
-  BrowserThread::PostTaskAndReplyWithResult(
-      BrowserThread::DB, FROM_HERE,
-      base::Bind(&NativeBackendGnome::UpdateLogin,
-                 base::Unretained(&backend),
-                 new_form_google,
-                 &changes),
+  base::PostTaskAndReplyWithResult(
+      backend.GetBackgroundTaskRunner().get(), FROM_HERE,
+      base::Bind(&NativeBackendGnome::UpdateLogin, base::Unretained(&backend),
+                 new_form_google, &changes),
       base::Bind(&CheckPasswordChangesWithResult, &expected_changes, &changes));
-  content::RunAllPendingInMessageLoop(BrowserThread::DB);
+
+  scoped_task_environment_.RunUntilIdle();
 
   EXPECT_EQ(1u, mock_keyring_items.size());
   if (mock_keyring_items.size() > 0)
@@ -936,12 +931,12 @@
   NativeBackendGnome backend(42);
   backend.Init();
 
-  BrowserThread::PostTask(
-      BrowserThread::DB, FROM_HERE,
+  backend.GetBackgroundTaskRunner()->PostTask(
+      FROM_HERE,
       base::BindOnce(base::IgnoreResult(&NativeBackendGnome::AddLogin),
                      base::Unretained(&backend), form_google_));
 
-  content::RunAllPendingInMessageLoop(BrowserThread::DB);
+  scoped_task_environment_.RunUntilIdle();
 
   EXPECT_EQ(1u, mock_keyring_items.size());
   if (mock_keyring_items.size() > 0)
@@ -950,13 +945,13 @@
   PasswordStoreChangeList changes;
   PasswordStoreChangeList expected_changes(
       1, PasswordStoreChange(PasswordStoreChange::REMOVE, form_google_));
-  BrowserThread::PostTaskAndReplyWithResult(
-      BrowserThread::DB, FROM_HERE,
-      base::Bind(&NativeBackendGnome::RemoveLogin,
-                 base::Unretained(&backend), form_google_, &changes),
+  base::PostTaskAndReplyWithResult(
+      backend.GetBackgroundTaskRunner().get(), FROM_HERE,
+      base::Bind(&NativeBackendGnome::RemoveLogin, base::Unretained(&backend),
+                 form_google_, &changes),
       base::Bind(&CheckPasswordChangesWithResult, &expected_changes, &changes));
 
-  content::RunAllPendingInMessageLoop(BrowserThread::DB);
+  scoped_task_environment_.RunUntilIdle();
 
   EXPECT_EQ(0u, mock_keyring_items.size());
 }
@@ -966,12 +961,12 @@
   NativeBackendGnome backend(42);
   backend.Init();
 
-  BrowserThread::PostTask(
-      BrowserThread::DB, FROM_HERE,
+  backend.GetBackgroundTaskRunner()->PostTask(
+      FROM_HERE,
       base::BindOnce(base::IgnoreResult(&NativeBackendGnome::AddLogin),
                      base::Unretained(&backend), form_google_));
 
-  content::RunAllPendingInMessageLoop(BrowserThread::DB);
+  scoped_task_environment_.RunUntilIdle();
 
   EXPECT_EQ(1u, mock_keyring_items.size());
   if (mock_keyring_items.size() > 0)
@@ -983,13 +978,13 @@
   PasswordStoreChangeList changes;
   PasswordStoreChangeList expected_changes(
       1, PasswordStoreChange(PasswordStoreChange::REMOVE, form_google_));
-  BrowserThread::PostTaskAndReplyWithResult(
-      BrowserThread::DB, FROM_HERE,
-      base::Bind(&NativeBackendGnome::RemoveLogin,
-                 base::Unretained(&backend), form_google_, &changes),
+  base::PostTaskAndReplyWithResult(
+      backend.GetBackgroundTaskRunner().get(), FROM_HERE,
+      base::Bind(&NativeBackendGnome::RemoveLogin, base::Unretained(&backend),
+                 form_google_, &changes),
       base::Bind(&CheckPasswordChangesWithResult, &expected_changes, &changes));
 
-  content::RunAllPendingInMessageLoop(BrowserThread::DB);
+  scoped_task_environment_.RunUntilIdle();
 
   EXPECT_EQ(0u, mock_keyring_items.size());
 }
@@ -999,12 +994,12 @@
   backend.Init();
 
   // First add an unrelated login.
-  BrowserThread::PostTask(
-      BrowserThread::DB, FROM_HERE,
+  backend.GetBackgroundTaskRunner()->PostTask(
+      FROM_HERE,
       base::BindOnce(base::IgnoreResult(&NativeBackendGnome::AddLogin),
                      base::Unretained(&backend), form_google_));
 
-  content::RunAllPendingInMessageLoop(BrowserThread::DB);
+  scoped_task_environment_.RunUntilIdle();
 
   EXPECT_EQ(1u, mock_keyring_items.size());
   if (mock_keyring_items.size() > 0)
@@ -1012,22 +1007,22 @@
 
   // Attempt to remove a login that doesn't exist.
   PasswordStoreChangeList changes;
-  BrowserThread::PostTaskAndReplyWithResult(
-      BrowserThread::DB, FROM_HERE,
-      base::Bind(&NativeBackendGnome::RemoveLogin,
-                 base::Unretained(&backend), form_isc_, &changes),
+  base::PostTaskAndReplyWithResult(
+      backend.GetBackgroundTaskRunner().get(), FROM_HERE,
+      base::Bind(&NativeBackendGnome::RemoveLogin, base::Unretained(&backend),
+                 form_isc_, &changes),
       base::Bind(&CheckPasswordChangesWithResult,
                  base::Owned(new PasswordStoreChangeList), &changes));
 
   // Make sure we can still get the first form back.
   std::vector<std::unique_ptr<PasswordForm>> form_list;
-  BrowserThread::PostTaskAndReplyWithResult(
-      BrowserThread::DB, FROM_HERE,
+  base::PostTaskAndReplyWithResult(
+      backend.GetBackgroundTaskRunner().get(), FROM_HERE,
       base::Bind(&NativeBackendGnome::GetAutofillableLogins,
                  base::Unretained(&backend), &form_list),
       base::Bind(&CheckTrue));
 
-  content::RunAllPendingInMessageLoop(BrowserThread::DB);
+  scoped_task_environment_.RunUntilIdle();
 
   // Quick check that we got something back.
   EXPECT_EQ(1u, form_list.size());
@@ -1042,12 +1037,12 @@
   backend.Init();
 
   // First add an unrelated login.
-  BrowserThread::PostTask(
-      BrowserThread::DB, FROM_HERE,
+  backend.GetBackgroundTaskRunner()->PostTask(
+      FROM_HERE,
       base::BindOnce(base::IgnoreResult(&NativeBackendGnome::AddLogin),
                      base::Unretained(&backend), form_google_));
 
-  content::RunAllPendingInMessageLoop(BrowserThread::DB);
+  scoped_task_environment_.RunUntilIdle();
 
   EXPECT_EQ(1u, mock_keyring_items.size());
   if (mock_keyring_items.size() > 0)
@@ -1055,15 +1050,14 @@
 
   // Attempt to update a login that doesn't exist.
   PasswordStoreChangeList changes;
-  BrowserThread::PostTaskAndReplyWithResult(
-      BrowserThread::DB, FROM_HERE,
-      base::Bind(&NativeBackendGnome::UpdateLogin,
-                 base::Unretained(&backend),
-                 form_isc_,
-                 &changes),
+  base::PostTaskAndReplyWithResult(
+      backend.GetBackgroundTaskRunner().get(), FROM_HERE,
+      base::Bind(&NativeBackendGnome::UpdateLogin, base::Unretained(&backend),
+                 form_isc_, &changes),
       base::Bind(&CheckPasswordChangesWithResult,
                  base::Owned(new PasswordStoreChangeList), &changes));
-  content::RunAllPendingInMessageLoop(BrowserThread::DB);
+
+  scoped_task_environment_.RunUntilIdle();
 
   EXPECT_EQ(1u, mock_keyring_items.size());
   if (mock_keyring_items.size() > 0)
@@ -1075,11 +1069,12 @@
   backend.Init();
 
   // First add an unrelated login.
-  BrowserThread::PostTask(
-      BrowserThread::DB, FROM_HERE,
+  backend.GetBackgroundTaskRunner()->PostTask(
+      FROM_HERE,
       base::BindOnce(base::IgnoreResult(&NativeBackendGnome::AddLogin),
                      base::Unretained(&backend), form_google_));
-  content::RunAllPendingInMessageLoop(BrowserThread::DB);
+
+  scoped_task_environment_.RunUntilIdle();
 
   EXPECT_EQ(1u, mock_keyring_items.size());
   if (mock_keyring_items.size() > 0)
@@ -1088,14 +1083,13 @@
   // Attempt to update the same login without changing anything.
   PasswordStoreChangeList changes;
   PasswordStoreChangeList expected_changes;
-  BrowserThread::PostTaskAndReplyWithResult(
-      BrowserThread::DB, FROM_HERE,
-      base::Bind(&NativeBackendGnome::UpdateLogin,
-                 base::Unretained(&backend),
-                 form_google_,
-                 &changes),
+  base::PostTaskAndReplyWithResult(
+      backend.GetBackgroundTaskRunner().get(), FROM_HERE,
+      base::Bind(&NativeBackendGnome::UpdateLogin, base::Unretained(&backend),
+                 form_google_, &changes),
       base::Bind(&CheckPasswordChangesWithResult, &expected_changes, &changes));
-  content::RunAllPendingInMessageLoop(BrowserThread::DB);
+
+  scoped_task_environment_.RunUntilIdle();
 
   EXPECT_EQ(1u, mock_keyring_items.size());
   if (mock_keyring_items.size() > 0)
@@ -1109,10 +1103,10 @@
   PasswordStoreChangeList changes;
   changes.push_back(PasswordStoreChange(PasswordStoreChange::ADD,
                                         form_google_));
-  BrowserThread::PostTaskAndReplyWithResult(
-      BrowserThread::DB, FROM_HERE,
-      base::Bind(&NativeBackendGnome::AddLogin,
-                 base::Unretained(&backend), form_google_),
+  base::PostTaskAndReplyWithResult(
+      backend.GetBackgroundTaskRunner().get(), FROM_HERE,
+      base::Bind(&NativeBackendGnome::AddLogin, base::Unretained(&backend),
+                 form_google_),
       base::Bind(&CheckPasswordChanges, changes));
 
   changes.clear();
@@ -1123,13 +1117,13 @@
   changes.push_back(PasswordStoreChange(PasswordStoreChange::ADD,
                                         form_google_));
 
-  BrowserThread::PostTaskAndReplyWithResult(
-      BrowserThread::DB, FROM_HERE,
-      base::Bind(&NativeBackendGnome::AddLogin,
-                 base::Unretained(&backend), form_google_),
+  base::PostTaskAndReplyWithResult(
+      backend.GetBackgroundTaskRunner().get(), FROM_HERE,
+      base::Bind(&NativeBackendGnome::AddLogin, base::Unretained(&backend),
+                 form_google_),
       base::Bind(&CheckPasswordChanges, changes));
 
-  content::RunAllPendingInMessageLoop(BrowserThread::DB);
+  scoped_task_environment_.RunUntilIdle();
 
   EXPECT_EQ(1u, mock_keyring_items.size());
   if (mock_keyring_items.size() > 0)
@@ -1149,23 +1143,23 @@
   saved_android_form.date_created = base::Time::Now();
 
   PasswordStore::FormDigest observed_android_form(saved_android_form);
-  BrowserThread::PostTaskAndReplyWithResult(
-      BrowserThread::DB, FROM_HERE,
-      base::Bind(&NativeBackendGnome::AddLogin,
-                 base::Unretained(&backend), saved_android_form),
+  base::PostTaskAndReplyWithResult(
+      backend.GetBackgroundTaskRunner().get(), FROM_HERE,
+      base::Bind(&NativeBackendGnome::AddLogin, base::Unretained(&backend),
+                 saved_android_form),
       base::Bind(&CheckPasswordChanges,
-                 PasswordStoreChangeList(1, PasswordStoreChange(
-                     PasswordStoreChange::ADD, saved_android_form))));
+                 PasswordStoreChangeList(
+                     1, PasswordStoreChange(PasswordStoreChange::ADD,
+                                            saved_android_form))));
 
   std::vector<std::unique_ptr<PasswordForm>> form_list;
-  BrowserThread::PostTaskAndReplyWithResult(
-      BrowserThread::DB, FROM_HERE,
-      base::Bind(&NativeBackendGnome::GetLogins,
-                 base::Unretained(&backend), observed_android_form,
-                 &form_list),
+  base::PostTaskAndReplyWithResult(
+      backend.GetBackgroundTaskRunner().get(), FROM_HERE,
+      base::Bind(&NativeBackendGnome::GetLogins, base::Unretained(&backend),
+                 observed_android_form, &form_list),
       base::Bind(&CheckTrue));
 
-  content::RunAllPendingInMessageLoop(BrowserThread::DB);
+  scoped_task_environment_.RunUntilIdle();
 
   EXPECT_EQ(1u, form_list.size());
   EXPECT_EQ(saved_android_form, *form_list[0]);
@@ -1185,16 +1179,16 @@
   form_google_.skip_zero_click = false;
   form_facebook_.skip_zero_click = false;
 
-  BrowserThread::PostTask(
-      BrowserThread::DB, FROM_HERE,
+  backend.GetBackgroundTaskRunner()->PostTask(
+      FROM_HERE,
       base::BindOnce(base::IgnoreResult(&NativeBackendGnome::AddLogin),
                      base::Unretained(&backend), form_google_));
-  BrowserThread::PostTask(
-      BrowserThread::DB, FROM_HERE,
+  backend.GetBackgroundTaskRunner()->PostTask(
+      FROM_HERE,
       base::BindOnce(base::IgnoreResult(&NativeBackendGnome::AddLogin),
                      base::Unretained(&backend), form_facebook_));
 
-  content::RunAllPendingInMessageLoop(BrowserThread::DB);
+  scoped_task_environment_.RunUntilIdle();
 
   EXPECT_EQ(2u, mock_keyring_items.size());
   for (const auto& item : mock_keyring_items)
@@ -1208,8 +1202,8 @@
       PasswordStoreChange(PasswordStoreChange::UPDATE, form_facebook_));
 
   PasswordStoreChangeList changes;
-  BrowserThread::PostTaskAndReplyWithResult(
-      BrowserThread::DB, FROM_HERE,
+  base::PostTaskAndReplyWithResult(
+      backend.GetBackgroundTaskRunner().get(), FROM_HERE,
       base::Bind(
           &NativeBackendGnome::DisableAutoSignInForOrigins,
           base::Unretained(&backend),
@@ -1218,7 +1212,8 @@
               form_facebook_.origin),
           &changes),
       base::Bind(&CheckPasswordChangesWithResult, &expected_changes, &changes));
-  content::RunAllPendingInMessageLoop(BrowserThread::DB);
+
+  scoped_task_environment_.RunUntilIdle();
 
   EXPECT_EQ(2u, mock_keyring_items.size());
   CheckStringAttribute(
@@ -1238,17 +1233,18 @@
   const char unique_string_replacement[] = "uniKue_unique_string";
   form_google_.origin =
       GURL(std::string("http://www.google.com/") + unique_string);
-  BrowserThread::PostTask(
-      BrowserThread::DB, FROM_HERE,
+  backend.GetBackgroundTaskRunner()->PostTask(
+      FROM_HERE,
       base::BindOnce(base::IgnoreResult(&NativeBackendGnome::AddLogin),
                      base::Unretained(&backend), form_google_));
   form_google_.origin =
       GURL(std::string("http://www.google.com/") + unique_string_replacement);
-  BrowserThread::PostTask(
-      BrowserThread::DB, FROM_HERE,
+  backend.GetBackgroundTaskRunner()->PostTask(
+      FROM_HERE,
       base::BindOnce(base::IgnoreResult(&NativeBackendGnome::AddLogin),
                      base::Unretained(&backend), form_google_));
-  content::RunAllPendingInMessageLoop(BrowserThread::DB);
+
+  scoped_task_environment_.RunUntilIdle();
 
   // Read the raw value back. Change the |unique_string| to
   // |unique_string_replacement| so the forms become unique.
@@ -1264,12 +1260,13 @@
 
   // Now test that GetAutofillableLogins returns only one form.
   std::vector<std::unique_ptr<PasswordForm>> form_list;
-  BrowserThread::PostTaskAndReplyWithResult(
-      BrowserThread::DB, FROM_HERE,
+  base::PostTaskAndReplyWithResult(
+      backend.GetBackgroundTaskRunner().get(), FROM_HERE,
       base::Bind(&NativeBackendGnome::GetAutofillableLogins,
                  base::Unretained(&backend), &form_list),
       base::Bind(&CheckTrue));
-  content::RunAllPendingInMessageLoop(BrowserThread::DB);
+
+  scoped_task_environment_.RunUntilIdle();
 
   EXPECT_EQ(1u, form_list.size());
   EXPECT_EQ(form_google_, *form_list[0]);
@@ -1283,24 +1280,24 @@
   NativeBackendGnome backend(42);
   backend.Init();
 
-  BrowserThread::PostTask(
-      BrowserThread::DB, FROM_HERE,
+  backend.GetBackgroundTaskRunner()->PostTask(
+      FROM_HERE,
       base::BindOnce(base::IgnoreResult(&NativeBackendGnome::AddLogin),
                      base::Unretained(&backend), form_google_));
 
-  BrowserThread::PostTask(
-      BrowserThread::DB, FROM_HERE,
+  backend.GetBackgroundTaskRunner()->PostTask(
+      FROM_HERE,
       base::BindOnce(base::IgnoreResult(&NativeBackendGnome::AddLogin),
                      base::Unretained(&backend), form_facebook_));
 
   std::vector<std::unique_ptr<PasswordForm>> form_list;
-  BrowserThread::PostTaskAndReplyWithResult(
-      BrowserThread::DB, FROM_HERE,
+  base::PostTaskAndReplyWithResult(
+      backend.GetBackgroundTaskRunner().get(), FROM_HERE,
       base::Bind(&NativeBackendGnome::GetAllLogins, base::Unretained(&backend),
                  &form_list),
       base::Bind(&CheckTrue));
 
-  content::RunAllPendingInMessageLoop(BrowserThread::DB);
+  scoped_task_environment_.RunUntilIdle();
 
   EXPECT_EQ(2u, form_list.size());
   EXPECT_THAT(form_list, UnorderedElementsAre(Pointee(form_google_),
diff --git a/chrome/browser/password_manager/native_backend_kwallet_x.cc b/chrome/browser/password_manager/native_backend_kwallet_x.cc
index db40e28..b797ad02 100644
--- a/chrome/browser/password_manager/native_backend_kwallet_x.cc
+++ b/chrome/browser/password_manager/native_backend_kwallet_x.cc
@@ -20,11 +20,11 @@
 #include "base/stl_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/synchronization/waitable_event.h"
+#include "base/task_scheduler/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "chrome/grit/chromium_strings.h"
 #include "components/autofill/core/common/password_form.h"
 #include "components/password_manager/core/browser/password_manager_util.h"
-#include "content/public/browser/browser_thread.h"
 #include "dbus/bus.h"
 #include "dbus/message.h"
 #include "dbus/object_path.h"
@@ -32,7 +32,6 @@
 #include "url/origin.h"
 
 using autofill::PasswordForm;
-using content::BrowserThread;
 
 namespace {
 
@@ -290,10 +289,14 @@
 
 }  // namespace
 
+// Using USER_VISIBLE priority, because the passwords obtained through tasks on
+// the background runner influence what the user sees.
 NativeBackendKWallet::NativeBackendKWallet(
     LocalProfileId id,
     base::nix::DesktopEnvironment desktop_env)
-    : profile_id_(id),
+    : background_task_runner_(base::CreateSequencedTaskRunnerWithTraits(
+          {base::MayBlock(), base::TaskPriority::USER_VISIBLE})),
+      profile_id_(id),
       kwallet_dbus_(desktop_env),
       app_name_(l10n_util::GetStringUTF8(IDS_PRODUCT_NAME)) {
   folder_name_ = GetProfileSpecificFolderName();
@@ -302,14 +305,15 @@
 NativeBackendKWallet::~NativeBackendKWallet() {
   // This destructor is called on the thread that is destroying the Profile
   // containing the PasswordStore that owns this NativeBackend. Generally that
-  // won't be the DB thread; it will be the UI thread. So we post a message to
-  // shut it down on the DB thread, and it will be destructed afterward when the
-  // scoped_refptr<dbus::Bus> goes out of scope. The NativeBackend will be
-  // destroyed before that occurs, but that's OK.
+  // won't be run by the background task runner; it will be on the main one. So
+  // we post a message to shut it down on the background task runner, and it
+  // will be destroyed afterward when the scoped_refptr<dbus::Bus> goes out of
+  // scope. The NativeBackend will be destroyed before that occurs, but that's
+  // OK.
   if (kwallet_dbus_.GetSessionBus()) {
-    BrowserThread::PostTask(BrowserThread::DB, FROM_HERE,
-                            base::BindOnce(&dbus::Bus::ShutdownAndBlock,
-                                           kwallet_dbus_.GetSessionBus()));
+    background_task_runner_->PostTask(
+        FROM_HERE, base::BindOnce(&dbus::Bus::ShutdownAndBlock,
+                                  kwallet_dbus_.GetSessionBus()));
   }
 }
 
@@ -320,28 +324,32 @@
 
 bool NativeBackendKWallet::InitWithBus(scoped_refptr<dbus::Bus> optional_bus) {
   // We must synchronously do a few DBus calls to figure out if initialization
-  // succeeds, but later, we'll want to do most work on the DB thread. So we
-  // have to do the initialization on the DB thread here too, and wait for it.
+  // succeeds, but later, we'll want to do most of the work on the background
+  // task runner. So we have to do the initialization on the background task
+  // runner here too, and wait for it.
   bool success = false;
   base::WaitableEvent event(base::WaitableEvent::ResetPolicy::AUTOMATIC,
                             base::WaitableEvent::InitialState::NOT_SIGNALED);
   // NativeBackendKWallet isn't reference counted, but we wait for InitWithBus
   // to finish, so we can safely use base::Unretained here.
-  BrowserThread::PostTask(
-      BrowserThread::DB, FROM_HERE,
-      base::BindOnce(&NativeBackendKWallet::InitOnDBThread,
+  background_task_runner_->PostTask(
+      FROM_HERE,
+      base::BindOnce(&NativeBackendKWallet::InitOnBackgroundTaskRunner,
                      base::Unretained(this), optional_bus, &event, &success));
 
-  // This ScopedAllowWait should not be here. http://crbug.com/125331
+  // This ScopedAllowWait should not be here. However, the whole backend is so
+  // close to deprecation that it does not make sense to refactor it. More info
+  // on https://crbug.com/739897.
   base::ThreadRestrictions::ScopedAllowWait allow_wait;
   event.Wait();
   return success;
 }
 
-void NativeBackendKWallet::InitOnDBThread(scoped_refptr<dbus::Bus> optional_bus,
-                                          base::WaitableEvent* event,
-                                          bool* success) {
-  DCHECK_CURRENTLY_ON(BrowserThread::DB);
+void NativeBackendKWallet::InitOnBackgroundTaskRunner(
+    scoped_refptr<dbus::Bus> optional_bus,
+    base::WaitableEvent* event,
+    bool* success) {
+  DCHECK(background_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(!kwallet_dbus_.GetSessionBus());
   if (optional_bus.get()) {
     // The optional_bus parameter is given when this method is called in tests.
@@ -363,7 +371,7 @@
 }
 
 NativeBackendKWallet::InitResult NativeBackendKWallet::InitWallet() {
-  DCHECK_CURRENTLY_ON(BrowserThread::DB);
+  DCHECK(background_task_runner_->RunsTasksInCurrentSequence());
 
   // Check that KWallet is enabled.
   bool enabled = false;
@@ -554,6 +562,11 @@
   return GetAllLoginsInternal(wallet_handle, forms);
 }
 
+scoped_refptr<base::SequencedTaskRunner>
+NativeBackendKWallet::GetBackgroundTaskRunner() {
+  return background_task_runner_;
+}
+
 bool NativeBackendKWallet::GetLoginsList(
     const std::string& signon_realm,
     int wallet_handle,
@@ -800,7 +813,7 @@
 }
 
 int NativeBackendKWallet::WalletHandle() {
-  DCHECK_CURRENTLY_ON(BrowserThread::DB);
+  DCHECK(background_task_runner_->RunsTasksInCurrentSequence());
 
   // Open the wallet.
   // TODO(mdm): Are we leaking these handles? Find out.
diff --git a/chrome/browser/password_manager/native_backend_kwallet_x.h b/chrome/browser/password_manager/native_backend_kwallet_x.h
index d92a911..59d809ea 100644
--- a/chrome/browser/password_manager/native_backend_kwallet_x.h
+++ b/chrome/browser/password_manager/native_backend_kwallet_x.h
@@ -13,6 +13,7 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/nix/xdg_util.h"
+#include "base/sequenced_task_runner.h"
 #include "base/time/time.h"
 #include "chrome/browser/password_manager/password_store_factory.h"
 #include "chrome/browser/password_manager/password_store_x.h"
@@ -65,6 +66,7 @@
       std::vector<std::unique_ptr<autofill::PasswordForm>>* forms) override;
   bool GetAllLogins(
       std::vector<std::unique_ptr<autofill::PasswordForm>>* forms) override;
+  scoped_refptr<base::SequencedTaskRunner> GetBackgroundTaskRunner() override;
 
  protected:
   // Invalid handle returned by WalletHandle().
@@ -94,9 +96,9 @@
 
   // Initialization.
   InitResult InitWallet();
-  void InitOnDBThread(scoped_refptr<dbus::Bus> optional_bus,
-                      base::WaitableEvent* event,
-                      bool* success);
+  void InitOnBackgroundTaskRunner(scoped_refptr<dbus::Bus> optional_bus,
+                                  base::WaitableEvent* event,
+                                  bool* success);
 
   // Overwrites |forms| with all credentials matching |signon_realm|. Returns
   // true on success.
@@ -140,6 +142,8 @@
   // Generates a profile-specific folder name based on profile_id_.
   std::string GetProfileSpecificFolderName() const;
 
+  scoped_refptr<base::SequencedTaskRunner> background_task_runner_;
+
   // The local profile id, used to generate the folder name.
   const LocalProfileId profile_id_;
 
diff --git a/chrome/browser/password_manager/native_backend_kwallet_x_unittest.cc b/chrome/browser/password_manager/native_backend_kwallet_x_unittest.cc
index 1de9f288..3ac5d7f 100644
--- a/chrome/browser/password_manager/native_backend_kwallet_x_unittest.cc
+++ b/chrome/browser/password_manager/native_backend_kwallet_x_unittest.cc
@@ -18,13 +18,13 @@
 #include "base/pickle.h"
 #include "base/stl_util.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/task_runner_util.h"
+#include "base/test/scoped_task_environment.h"
 #include "chrome/browser/password_manager/native_backend_kwallet_x.h"
 #include "chrome/test/base/testing_profile.h"
 #include "components/autofill/core/common/password_form.h"
 #include "components/password_manager/core/common/password_manager_pref_names.h"
 #include "components/prefs/pref_service.h"
-#include "content/public/test/test_browser_thread_bundle.h"
-#include "content/public/test/test_utils.h"
 #include "dbus/message.h"
 #include "dbus/mock_bus.h"
 #include "dbus/mock_object_proxy.h"
@@ -35,7 +35,6 @@
 
 using autofill::PasswordForm;
 using base::UTF8ToUTF16;
-using content::BrowserThread;
 using password_manager::PasswordStoreChange;
 using password_manager::PasswordStoreChangeList;
 using testing::_;
@@ -169,8 +168,7 @@
  public:
   NativeBackendKWalletStub(LocalProfileId id,
                            base::nix::DesktopEnvironment desktop_env)
-      :  NativeBackendKWallet(id, desktop_env) {
-  }
+      : NativeBackendKWallet(id, desktop_env) {}
   using NativeBackendKWallet::InitWithBus;
   using NativeBackendKWallet::kInvalidKWalletHandle;
   using NativeBackendKWallet::DeserializeValue;
@@ -226,6 +224,8 @@
       const PasswordStoreChangeList* actual,
       bool result);
 
+  base::test::ScopedTaskEnvironment scoped_task_environment_;
+
   PasswordForm old_form_google_;
   PasswordForm form_google_;
   PasswordForm form_isc_;
@@ -284,9 +284,7 @@
 class NativeBackendKWalletTest : public NativeBackendKWalletTestBase {
  protected:
   NativeBackendKWalletTest()
-      : test_browser_thread_bundle_(
-            content::TestBrowserThreadBundle::REAL_DB_THREAD),
-        klauncher_ret_(0),
+      : klauncher_ret_(0),
         klauncher_contacted_(false),
         kwallet_runnable_(true),
         kwallet_running_(true),
@@ -310,8 +308,6 @@
   // Tests RemoveLoginsCreatedBetween or RemoveLoginsSyncedBetween.
   void TestRemoveLoginsBetween(RemoveBetweenMethod date_to_test);
 
-  content::TestBrowserThreadBundle test_browser_thread_bundle_;
-
   scoped_refptr<dbus::MockBus> mock_session_bus_;
   scoped_refptr<dbus::MockObjectProxy> mock_klauncher_proxy_;
   scoped_refptr<dbus::MockObjectProxy> mock_kwallet_proxy_;
@@ -410,12 +406,12 @@
     form_isc_.date_synced = next_day;
   }
 
-  BrowserThread::PostTask(
-      BrowserThread::DB, FROM_HERE,
+  backend.GetBackgroundTaskRunner()->PostTask(
+      FROM_HERE,
       base::BindOnce(base::IgnoreResult(&NativeBackendKWalletStub::AddLogin),
                      base::Unretained(&backend), form_google_));
-  BrowserThread::PostTask(
-      BrowserThread::DB, FROM_HERE,
+  backend.GetBackgroundTaskRunner()->PostTask(
+      FROM_HERE,
       base::BindOnce(base::IgnoreResult(&NativeBackendKWalletStub::AddLogin),
                      base::Unretained(&backend), form_isc_));
 
@@ -428,13 +424,13 @@
       date_to_test == CREATED
           ? &NativeBackendKWalletStub::RemoveLoginsCreatedBetween
           : &NativeBackendKWalletStub::RemoveLoginsSyncedBetween;
-  BrowserThread::PostTaskAndReplyWithResult(
-      BrowserThread::DB,
-      FROM_HERE,
-      base::Bind(
-          method, base::Unretained(&backend), base::Time(), next_day, &changes),
+  base::PostTaskAndReplyWithResult(
+      backend.GetBackgroundTaskRunner().get(), FROM_HERE,
+      base::Bind(method, base::Unretained(&backend), base::Time(), next_day,
+                 &changes),
       base::Bind(&CheckPasswordChangesWithResult, &expected_changes, &changes));
-  content::RunAllPendingInMessageLoop(BrowserThread::DB);
+
+  scoped_task_environment_.RunUntilIdle();
 
   std::vector<const PasswordForm*> forms;
   forms.push_back(&form_isc_);
@@ -446,13 +442,13 @@
   expected_changes.clear();
   expected_changes.push_back(
       PasswordStoreChange(PasswordStoreChange::REMOVE, form_isc_));
-  BrowserThread::PostTaskAndReplyWithResult(
-      BrowserThread::DB,
-      FROM_HERE,
-      base::Bind(
-          method, base::Unretained(&backend), next_day, base::Time(), &changes),
+  base::PostTaskAndReplyWithResult(
+      backend.GetBackgroundTaskRunner().get(), FROM_HERE,
+      base::Bind(method, base::Unretained(&backend), next_day, base::Time(),
+                 &changes),
       base::Bind(&CheckPasswordChangesWithResult, &expected_changes, &changes));
-  content::RunAllPendingInMessageLoop(BrowserThread::DB);
+
+  scoped_task_environment_.RunUntilIdle();
 
   CheckPasswordForms("Chrome Form Data (42)", ExpectationArray());
 }
@@ -680,15 +676,16 @@
   NativeBackendKWalletStub backend(42, desktop_env_);
   EXPECT_TRUE(backend.InitWithBus(mock_session_bus_));
 
-  BrowserThread::PostTaskAndReplyWithResult(
-      BrowserThread::DB, FROM_HERE,
+  base::PostTaskAndReplyWithResult(
+      backend.GetBackgroundTaskRunner().get(), FROM_HERE,
       base::Bind(&NativeBackendKWalletStub::AddLogin,
                  base::Unretained(&backend), form_google_),
-      base::Bind(&CheckPasswordChanges,
-                 PasswordStoreChangeList(1, PasswordStoreChange(
-                     PasswordStoreChange::ADD, form_google_))));
+      base::Bind(
+          &CheckPasswordChanges,
+          PasswordStoreChangeList(
+              1, PasswordStoreChange(PasswordStoreChange::ADD, form_google_))));
 
-  content::RunAllPendingInMessageLoop(BrowserThread::DB);
+  scoped_task_environment_.RunUntilIdle();
 
   EXPECT_FALSE(wallet_.hasFolder("Chrome Form Data"));
 
@@ -703,12 +700,12 @@
   NativeBackendKWalletStub backend(42, desktop_env_);
   EXPECT_TRUE(backend.InitWithBus(mock_session_bus_));
 
-  BrowserThread::PostTask(
-      BrowserThread::DB, FROM_HERE,
+  backend.GetBackgroundTaskRunner()->PostTask(
+      FROM_HERE,
       base::BindOnce(base::IgnoreResult(&NativeBackendKWalletStub::AddLogin),
                      base::Unretained(&backend), form_google_));
 
-  content::RunAllPendingInMessageLoop(BrowserThread::DB);
+  scoped_task_environment_.RunUntilIdle();
 
   PasswordForm new_form_google(form_google_);
   new_form_google.times_used = 10;
@@ -718,14 +715,13 @@
   PasswordStoreChangeList changes;
   PasswordStoreChangeList expected_changes(
       1, PasswordStoreChange(PasswordStoreChange::UPDATE, new_form_google));
-  BrowserThread::PostTaskAndReplyWithResult(
-      BrowserThread::DB, FROM_HERE,
+  base::PostTaskAndReplyWithResult(
+      backend.GetBackgroundTaskRunner().get(), FROM_HERE,
       base::Bind(&NativeBackendKWalletStub::UpdateLogin,
-                 base::Unretained(&backend),
-                 new_form_google,
-                 &changes),
+                 base::Unretained(&backend), new_form_google, &changes),
       base::Bind(&CheckPasswordChangesWithResult, &expected_changes, &changes));
-  content::RunAllPendingInMessageLoop(BrowserThread::DB);
+
+  scoped_task_environment_.RunUntilIdle();
 
   ASSERT_EQ(1u, changes.size());
   EXPECT_EQ(PasswordStoreChange::UPDATE, changes.front().type());
@@ -742,19 +738,19 @@
   NativeBackendKWalletStub backend(42, desktop_env_);
   EXPECT_TRUE(backend.InitWithBus(mock_session_bus_));
 
-  BrowserThread::PostTask(
-      BrowserThread::DB, FROM_HERE,
+  backend.GetBackgroundTaskRunner()->PostTask(
+      FROM_HERE,
       base::BindOnce(base::IgnoreResult(&NativeBackendKWalletStub::AddLogin),
                      base::Unretained(&backend), form_google_));
 
   std::vector<std::unique_ptr<PasswordForm>> form_list;
-  BrowserThread::PostTaskAndReplyWithResult(
-      BrowserThread::DB, FROM_HERE,
+  base::PostTaskAndReplyWithResult(
+      backend.GetBackgroundTaskRunner().get(), FROM_HERE,
       base::Bind(&NativeBackendKWalletStub::GetAutofillableLogins,
                  base::Unretained(&backend), &form_list),
       base::Bind(&CheckTrue));
 
-  content::RunAllPendingInMessageLoop(BrowserThread::DB);
+  scoped_task_environment_.RunUntilIdle();
 
   // Quick check that we got something back.
   EXPECT_EQ(1u, form_list.size());
@@ -772,12 +768,12 @@
   NativeBackendKWalletStub backend(42, desktop_env_);
   EXPECT_TRUE(backend.InitWithBus(mock_session_bus_));
 
-  BrowserThread::PostTask(
-      BrowserThread::DB, FROM_HERE,
+  backend.GetBackgroundTaskRunner()->PostTask(
+      FROM_HERE,
       base::BindOnce(base::IgnoreResult(&NativeBackendKWalletStub::AddLogin),
                      base::Unretained(&backend), form_google_));
 
-  content::RunAllPendingInMessageLoop(BrowserThread::DB);
+  scoped_task_environment_.RunUntilIdle();
 
   EXPECT_FALSE(wallet_.hasFolder("Chrome Form Data"));
 
@@ -790,13 +786,13 @@
   PasswordStoreChangeList changes;
   PasswordStoreChangeList expected_changes(
       1, PasswordStoreChange(PasswordStoreChange::REMOVE, form_google_));
-  BrowserThread::PostTaskAndReplyWithResult(
-      BrowserThread::DB, FROM_HERE,
+  base::PostTaskAndReplyWithResult(
+      backend.GetBackgroundTaskRunner().get(), FROM_HERE,
       base::Bind(&NativeBackendKWalletStub::RemoveLogin,
                  base::Unretained(&backend), form_google_, &changes),
       base::Bind(&CheckPasswordChangesWithResult, &expected_changes, &changes));
 
-  content::RunAllPendingInMessageLoop(BrowserThread::DB);
+  scoped_task_environment_.RunUntilIdle();
 
   expected.clear();
   CheckPasswordForms("Chrome Form Data (42)", expected);
@@ -807,12 +803,12 @@
   EXPECT_TRUE(backend.InitWithBus(mock_session_bus_));
 
   // First add an unrelated login.
-  BrowserThread::PostTask(
-      BrowserThread::DB, FROM_HERE,
+  backend.GetBackgroundTaskRunner()->PostTask(
+      FROM_HERE,
       base::BindOnce(base::IgnoreResult(&NativeBackendKWalletStub::AddLogin),
                      base::Unretained(&backend), form_google_));
 
-  content::RunAllPendingInMessageLoop(BrowserThread::DB);
+  scoped_task_environment_.RunUntilIdle();
 
   std::vector<const PasswordForm*> forms;
   forms.push_back(&form_google_);
@@ -822,16 +818,14 @@
 
   // Attempt to update a login that doesn't exist.
   PasswordStoreChangeList changes;
-  BrowserThread::PostTaskAndReplyWithResult(
-      BrowserThread::DB, FROM_HERE,
+  base::PostTaskAndReplyWithResult(
+      backend.GetBackgroundTaskRunner().get(), FROM_HERE,
       base::Bind(&NativeBackendKWalletStub::UpdateLogin,
-                 base::Unretained(&backend),
-                 form_isc_,
-                 &changes),
+                 base::Unretained(&backend), form_isc_, &changes),
       base::Bind(&CheckPasswordChangesWithResult,
                  base::Owned(new PasswordStoreChangeList), &changes));
 
-  content::RunAllPendingInMessageLoop(BrowserThread::DB);
+  scoped_task_environment_.RunUntilIdle();
 
   EXPECT_EQ(PasswordStoreChangeList(), changes);
   CheckPasswordForms("Chrome Form Data (42)", expected);
@@ -842,12 +836,12 @@
   EXPECT_TRUE(backend.InitWithBus(mock_session_bus_));
 
   // First add an unrelated login.
-  BrowserThread::PostTask(
-      BrowserThread::DB, FROM_HERE,
+  backend.GetBackgroundTaskRunner()->PostTask(
+      FROM_HERE,
       base::BindOnce(base::IgnoreResult(&NativeBackendKWalletStub::AddLogin),
                      base::Unretained(&backend), form_google_));
 
-  content::RunAllPendingInMessageLoop(BrowserThread::DB);
+  scoped_task_environment_.RunUntilIdle();
 
   EXPECT_FALSE(wallet_.hasFolder("Chrome Form Data"));
 
@@ -859,8 +853,8 @@
 
   // Attempt to remove a login that doesn't exist.
   PasswordStoreChangeList changes;
-  BrowserThread::PostTaskAndReplyWithResult(
-      BrowserThread::DB, FROM_HERE,
+  base::PostTaskAndReplyWithResult(
+      backend.GetBackgroundTaskRunner().get(), FROM_HERE,
       base::Bind(&NativeBackendKWalletStub::RemoveLogin,
                  base::Unretained(&backend), form_isc_, &changes),
       base::Bind(&CheckPasswordChangesWithResult,
@@ -868,13 +862,13 @@
 
   // Make sure we can still get the first form back.
   std::vector<std::unique_ptr<PasswordForm>> form_list;
-  BrowserThread::PostTaskAndReplyWithResult(
-      BrowserThread::DB, FROM_HERE,
+  base::PostTaskAndReplyWithResult(
+      backend.GetBackgroundTaskRunner().get(), FROM_HERE,
       base::Bind(&NativeBackendKWalletStub::GetAutofillableLogins,
                  base::Unretained(&backend), &form_list),
       base::Bind(&CheckTrue));
 
-  content::RunAllPendingInMessageLoop(BrowserThread::DB);
+  scoped_task_environment_.RunUntilIdle();
 
   // Quick check that we got something back.
   EXPECT_EQ(1u, form_list.size());
@@ -889,12 +883,11 @@
   PasswordStoreChangeList changes;
   changes.push_back(PasswordStoreChange(PasswordStoreChange::ADD,
                                         form_google_));
-  BrowserThread::PostTaskAndReplyWithResult(
-      BrowserThread::DB, FROM_HERE,
+  base::PostTaskAndReplyWithResult(
+      backend.GetBackgroundTaskRunner().get(), FROM_HERE,
       base::Bind(&NativeBackendKWalletStub::AddLogin,
                  base::Unretained(&backend), form_google_),
-      base::Bind(&NativeBackendKWalletTest::CheckPasswordChanges,
-                 changes));
+      base::Bind(&NativeBackendKWalletTest::CheckPasswordChanges, changes));
 
   changes.clear();
   changes.push_back(PasswordStoreChange(PasswordStoreChange::REMOVE,
@@ -904,14 +897,13 @@
   changes.push_back(PasswordStoreChange(PasswordStoreChange::ADD,
                                         form_google_));
 
-  BrowserThread::PostTaskAndReplyWithResult(
-      BrowserThread::DB, FROM_HERE,
+  base::PostTaskAndReplyWithResult(
+      backend.GetBackgroundTaskRunner().get(), FROM_HERE,
       base::Bind(&NativeBackendKWalletStub::AddLogin,
                  base::Unretained(&backend), form_google_),
-      base::Bind(&NativeBackendKWalletTest::CheckPasswordChanges,
-                 changes));
+      base::Bind(&NativeBackendKWalletTest::CheckPasswordChanges, changes));
 
-  content::RunAllPendingInMessageLoop(BrowserThread::DB);
+  scoped_task_environment_.RunUntilIdle();
 
   EXPECT_FALSE(wallet_.hasFolder("Chrome Form Data"));
 
@@ -935,22 +927,23 @@
 
   password_manager::PasswordStore::FormDigest observed_android_form(
       saved_android_form);
-  BrowserThread::PostTaskAndReplyWithResult(
-      BrowserThread::DB, FROM_HERE,
+  base::PostTaskAndReplyWithResult(
+      backend.GetBackgroundTaskRunner().get(), FROM_HERE,
       base::Bind(&NativeBackendKWalletStub::AddLogin,
                  base::Unretained(&backend), saved_android_form),
       base::Bind(&CheckPasswordChanges,
-                 PasswordStoreChangeList(1, PasswordStoreChange(
-                     PasswordStoreChange::ADD, saved_android_form))));
+                 PasswordStoreChangeList(
+                     1, PasswordStoreChange(PasswordStoreChange::ADD,
+                                            saved_android_form))));
 
   std::vector<std::unique_ptr<PasswordForm>> form_list;
-  BrowserThread::PostTaskAndReplyWithResult(
-      BrowserThread::DB, FROM_HERE,
+  base::PostTaskAndReplyWithResult(
+      backend.GetBackgroundTaskRunner().get(), FROM_HERE,
       base::Bind(&NativeBackendKWalletStub::GetLogins,
                  base::Unretained(&backend), observed_android_form, &form_list),
       base::Bind(&CheckTrue));
 
-  content::RunAllPendingInMessageLoop(BrowserThread::DB);
+  scoped_task_environment_.RunUntilIdle();
 
   EXPECT_EQ(1u, form_list.size());
 
@@ -977,16 +970,16 @@
   form_isc_.skip_zero_click = false;
   form_google_.skip_zero_click = false;
 
-  BrowserThread::PostTask(
-      BrowserThread::DB, FROM_HERE,
+  backend.GetBackgroundTaskRunner()->PostTask(
+      FROM_HERE,
       base::BindOnce(base::IgnoreResult(&NativeBackendKWallet::AddLogin),
                      base::Unretained(&backend), form_isc_));
-  BrowserThread::PostTask(
-      BrowserThread::DB, FROM_HERE,
+  backend.GetBackgroundTaskRunner()->PostTask(
+      FROM_HERE,
       base::BindOnce(base::IgnoreResult(&NativeBackendKWallet::AddLogin),
                      base::Unretained(&backend), form_google_));
 
-  content::RunAllPendingInMessageLoop(BrowserThread::DB);
+  scoped_task_environment_.RunUntilIdle();
 
   // Set the canonical forms to the updated value for the following comparison.
   form_google_.skip_zero_click = true;
@@ -995,8 +988,8 @@
       PasswordStoreChange(PasswordStoreChange::UPDATE, form_google_));
 
   PasswordStoreChangeList changes;
-  BrowserThread::PostTaskAndReplyWithResult(
-      BrowserThread::DB, FROM_HERE,
+  base::PostTaskAndReplyWithResult(
+      backend.GetBackgroundTaskRunner().get(), FROM_HERE,
       base::Bind(
           &NativeBackendKWallet::DisableAutoSignInForOrigins,
           base::Unretained(&backend),
@@ -1005,7 +998,8 @@
               form_google_.origin),
           &changes),
       base::Bind(&CheckPasswordChangesWithResult, &expected_changes, &changes));
-  content::RunAllPendingInMessageLoop(BrowserThread::DB);
+
+  scoped_task_environment_.RunUntilIdle();
 
   std::vector<const PasswordForm*> forms;
   forms.push_back(&form_google_);
@@ -1026,17 +1020,18 @@
   const char unique_string_replacement[] = "uniKue_unique_string";
   form_google_.origin =
       GURL(std::string("http://www.google.com/") + unique_string);
-  BrowserThread::PostTask(
-      BrowserThread::DB, FROM_HERE,
+  backend.GetBackgroundTaskRunner()->PostTask(
+      FROM_HERE,
       base::BindOnce(base::IgnoreResult(&NativeBackendKWalletStub::AddLogin),
                      base::Unretained(&backend), form_google_));
   form_google_.origin =
       GURL(std::string("http://www.google.com/") + unique_string_replacement);
-  BrowserThread::PostTask(
-      BrowserThread::DB, FROM_HERE,
+  backend.GetBackgroundTaskRunner()->PostTask(
+      FROM_HERE,
       base::BindOnce(base::IgnoreResult(&NativeBackendKWalletStub::AddLogin),
                      base::Unretained(&backend), form_google_));
-  content::RunAllPendingInMessageLoop(BrowserThread::DB);
+
+  scoped_task_environment_.RunUntilIdle();
 
   // Read the raw value back. Change the |unique_string| to
   // |unique_string_replacement| so the forms become unique.
@@ -1052,12 +1047,13 @@
 
   // Now test that GetAutofillableLogins returns only one form.
   std::vector<std::unique_ptr<PasswordForm>> form_list;
-  BrowserThread::PostTaskAndReplyWithResult(
-      BrowserThread::DB, FROM_HERE,
+  base::PostTaskAndReplyWithResult(
+      backend.GetBackgroundTaskRunner().get(), FROM_HERE,
       base::Bind(&NativeBackendKWalletStub::GetAutofillableLogins,
                  base::Unretained(&backend), &form_list),
       base::Bind(&CheckTrue));
-  content::RunAllPendingInMessageLoop(BrowserThread::DB);
+
+  scoped_task_environment_.RunUntilIdle();
 
   EXPECT_EQ(1u, form_list.size());
   EXPECT_EQ(form_google_, *form_list[0]);
@@ -1077,21 +1073,23 @@
   failing_methods_.insert("readEntry");
 
   // Store some non-blacklisted logins to be potentially returned.
-  BrowserThread::PostTaskAndReplyWithResult(
-      BrowserThread::DB, FROM_HERE,
+  base::PostTaskAndReplyWithResult(
+      backend.GetBackgroundTaskRunner().get(), FROM_HERE,
       base::Bind(&NativeBackendKWalletStub::AddLogin,
                  base::Unretained(&backend), form_google_),
-      base::Bind(&CheckPasswordChanges,
-                 PasswordStoreChangeList(1, PasswordStoreChange(
-                      PasswordStoreChange::ADD, form_google_))));
+      base::Bind(
+          &CheckPasswordChanges,
+          PasswordStoreChangeList(
+              1, PasswordStoreChange(PasswordStoreChange::ADD, form_google_))));
 
   // Verify that nothing is in fact returned, because KWallet fails to respond.
   std::vector<std::unique_ptr<PasswordForm>> form_list;
-  BrowserThread::PostTask(
-      BrowserThread::DB, FROM_HERE,
-      base::BindOnce(&CheckGetAutofillableLoginsFails,
-                     base::Unretained(&backend), &form_list));
-  content::RunAllPendingInMessageLoop(BrowserThread::DB);
+  backend.GetBackgroundTaskRunner()->PostTask(
+      FROM_HERE, base::BindOnce(&CheckGetAutofillableLoginsFails,
+                                base::Unretained(&backend), &form_list));
+
+  scoped_task_environment_.RunUntilIdle();
+
   EXPECT_EQ(0u, form_list.size());
 }
 
@@ -1099,23 +1097,23 @@
   NativeBackendKWalletStub backend(42, desktop_env_);
   EXPECT_TRUE(backend.InitWithBus(mock_session_bus_));
 
-  BrowserThread::PostTask(
-      BrowserThread::DB, FROM_HERE,
+  backend.GetBackgroundTaskRunner()->PostTask(
+      FROM_HERE,
       base::BindOnce(base::IgnoreResult(&NativeBackendKWalletStub::AddLogin),
                      base::Unretained(&backend), form_google_));
-  BrowserThread::PostTask(
-      BrowserThread::DB, FROM_HERE,
+  backend.GetBackgroundTaskRunner()->PostTask(
+      FROM_HERE,
       base::BindOnce(base::IgnoreResult(&NativeBackendKWalletStub::AddLogin),
                      base::Unretained(&backend), form_isc_));
 
   std::vector<std::unique_ptr<PasswordForm>> form_list;
-  BrowserThread::PostTaskAndReplyWithResult(
-      BrowserThread::DB, FROM_HERE,
+  base::PostTaskAndReplyWithResult(
+      backend.GetBackgroundTaskRunner().get(), FROM_HERE,
       base::Bind(&NativeBackendKWalletStub::GetAllLogins,
                  base::Unretained(&backend), &form_list),
       base::Bind(&CheckTrue));
 
-  content::RunAllPendingInMessageLoop(BrowserThread::DB);
+  scoped_task_environment_.RunUntilIdle();
 
   EXPECT_EQ(2u, form_list.size());
   EXPECT_THAT(form_list,
diff --git a/chrome/browser/password_manager/native_backend_libsecret.cc b/chrome/browser/password_manager/native_backend_libsecret.cc
index 1a6a99ab..36c4229 100644
--- a/chrome/browser/password_manager/native_backend_libsecret.cc
+++ b/chrome/browser/password_manager/native_backend_libsecret.cc
@@ -410,6 +410,11 @@
   return GetLoginsList(nullptr, ALL_LOGINS, forms);
 }
 
+scoped_refptr<base::SequencedTaskRunner>
+NativeBackendLibsecret::GetBackgroundTaskRunner() {
+  return nullptr;
+}
+
 bool NativeBackendLibsecret::GetLoginsList(
     const PasswordStore::FormDigest* lookup_form,
     GetLoginsListOptions options,
diff --git a/chrome/browser/password_manager/native_backend_libsecret.h b/chrome/browser/password_manager/native_backend_libsecret.h
index f6e06c6..47aafb4 100644
--- a/chrome/browser/password_manager/native_backend_libsecret.h
+++ b/chrome/browser/password_manager/native_backend_libsecret.h
@@ -56,6 +56,7 @@
       std::vector<std::unique_ptr<autofill::PasswordForm>>* forms) override;
   bool GetAllLogins(
       std::vector<std::unique_ptr<autofill::PasswordForm>>* forms) override;
+  scoped_refptr<base::SequencedTaskRunner> GetBackgroundTaskRunner() override;
 
  private:
   enum TimestampToCompare {
diff --git a/chrome/browser/password_manager/password_store_factory.cc b/chrome/browser/password_manager/password_store_factory.cc
index 4c5297e3..ae2d8cc4 100644
--- a/chrome/browser/password_manager/password_store_factory.cc
+++ b/chrome/browser/password_manager/password_store_factory.cc
@@ -263,8 +263,8 @@
         " for more information about password storage options.";
   }
 
-  ps = new PasswordStoreX(main_thread_runner, db_thread_runner,
-                          std::move(login_db), backend.release());
+  ps = new PasswordStoreX(main_thread_runner, std::move(login_db),
+                          backend.release());
   RecordBackendStatistics(desktop_env, store_type, used_backend);
 #elif defined(USE_OZONE)
   ps = new password_manager::PasswordStoreDefault(
diff --git a/chrome/browser/password_manager/password_store_x.cc b/chrome/browser/password_manager/password_store_x.cc
index 927dc6e..1679262 100644
--- a/chrome/browser/password_manager/password_store_x.cc
+++ b/chrome/browser/password_manager/password_store_x.cc
@@ -12,17 +12,16 @@
 #include "base/bind.h"
 #include "base/logging.h"
 #include "base/stl_util.h"
+#include "base/task_scheduler/post_task.h"
 #include "chrome/browser/chrome_notification_types.h"
 #include "components/password_manager/core/browser/password_manager_util.h"
 #include "components/password_manager/core/browser/password_store_change.h"
 #include "components/password_manager/core/common/password_manager_pref_names.h"
 #include "components/pref_registry/pref_registry_syncable.h"
 #include "components/prefs/pref_service.h"
-#include "content/public/browser/browser_thread.h"
 #include "content/public/browser/notification_service.h"
 
 using autofill::PasswordForm;
-using content::BrowserThread;
 using password_manager::PasswordStoreChange;
 using password_manager::PasswordStoreChangeList;
 using password_manager::PasswordStoreDefault;
@@ -58,15 +57,29 @@
   return true;
 }
 
+// Only meant to be called once, during the construction of PasswordStoreX.
+// Multiple calls would potentially return different task runners.
+scoped_refptr<base::SequencedTaskRunner> GetBackgroundTaskRunnerForBackend(
+    PasswordStoreX::NativeBackend* backend) {
+  scoped_refptr<base::SequencedTaskRunner> result;
+  if (backend)
+    result = backend->GetBackgroundTaskRunner();
+  if (result)
+    return result;
+  // Using USER_VISIBLE priority, because the passwords obtained through tasks
+  // on the background runner influence what the user sees.
+  return base::CreateSequencedTaskRunnerWithTraits(
+      {base::MayBlock(), base::TaskPriority::USER_VISIBLE});
+}
+
 }  // namespace
 
 PasswordStoreX::PasswordStoreX(
     scoped_refptr<base::SequencedTaskRunner> main_thread_runner,
-    scoped_refptr<base::SequencedTaskRunner> db_thread_runner,
     std::unique_ptr<password_manager::LoginDatabase> login_db,
     NativeBackend* backend)
     : PasswordStoreDefault(main_thread_runner,
-                           db_thread_runner,
+                           GetBackgroundTaskRunnerForBackend(backend),
                            std::move(login_db)),
       backend_(backend),
       migration_checked_(!backend),
@@ -245,7 +258,7 @@
 }
 
 void PasswordStoreX::CheckMigration() {
-  DCHECK_CURRENTLY_ON(BrowserThread::DB);
+  DCHECK(GetBackgroundTaskRunner()->RunsTasksInCurrentSequence());
   if (migration_checked_ || !backend_.get())
     return;
   migration_checked_ = true;
diff --git a/chrome/browser/password_manager/password_store_x.h b/chrome/browser/password_manager/password_store_x.h
index 5207456e..23f2eb1 100644
--- a/chrome/browser/password_manager/password_store_x.h
+++ b/chrome/browser/password_manager/password_store_x.h
@@ -84,12 +84,15 @@
     virtual bool GetAllLogins(
         std::vector<std::unique_ptr<autofill::PasswordForm>>* forms)
         WARN_UNUSED_RESULT = 0;
+
+    // Returns the background thread in case the backend uses one, or null.
+    virtual scoped_refptr<base::SequencedTaskRunner>
+    GetBackgroundTaskRunner() = 0;
   };
 
   // Takes ownership of |login_db| and |backend|. |backend| may be NULL in which
   // case this PasswordStoreX will act the same as PasswordStoreDefault.
   PasswordStoreX(scoped_refptr<base::SequencedTaskRunner> main_thread_runner,
-                 scoped_refptr<base::SequencedTaskRunner> db_thread_runner,
                  std::unique_ptr<password_manager::LoginDatabase> login_db,
                  NativeBackend* backend);
 
diff --git a/chrome/browser/password_manager/password_store_x_unittest.cc b/chrome/browser/password_manager/password_store_x_unittest.cc
index 67cd935..02b9c01 100644
--- a/chrome/browser/password_manager/password_store_x_unittest.cc
+++ b/chrome/browser/password_manager/password_store_x_unittest.cc
@@ -130,6 +130,10 @@
     *forms = CreateTrashForms();
     return false;
   }
+
+  scoped_refptr<base::SequencedTaskRunner> GetBackgroundTaskRunner() override {
+    return nullptr;
+  }
 };
 
 class MockBackend : public PasswordStoreX::NativeBackend {
@@ -231,6 +235,10 @@
     return true;
   }
 
+  scoped_refptr<base::SequencedTaskRunner> GetBackgroundTaskRunner() override {
+    return nullptr;
+  }
+
  private:
   void erase(size_t index) {
     if (index < all_forms_.size() - 1)
@@ -334,7 +342,6 @@
     : backend_type_(backend_type) {
   SetupTempDir();
   store_ = new PasswordStoreX(base::SequencedTaskRunnerHandle::Get(),
-                              base::SequencedTaskRunnerHandle::Get(),
                               base::MakeUnique<password_manager::LoginDatabase>(
                                   test_login_db_file_path()),
                               GetBackend(backend_type_));
@@ -404,7 +411,6 @@
       new password_manager::LoginDatabase(test_login_db_file_path()));
   scoped_refptr<PasswordStoreX> store(
       new PasswordStoreX(base::SequencedTaskRunnerHandle::Get(),
-                         base::SequencedTaskRunnerHandle::Get(),
                          std::move(login_db), GetBackend(GetParam())));
   store->Init(syncer::SyncableService::StartSyncFlare(), nullptr);
 
@@ -511,7 +517,6 @@
   login_db.reset(new password_manager::LoginDatabase(login_db_file));
   scoped_refptr<PasswordStoreX> store(
       new PasswordStoreX(base::SequencedTaskRunnerHandle::Get(),
-                         base::SequencedTaskRunnerHandle::Get(),
                          std::move(login_db), GetBackend(GetParam())));
   store->Init(syncer::SyncableService::StartSyncFlare(), nullptr);
 
diff --git a/chrome/browser/permissions/permission_request_manager.cc b/chrome/browser/permissions/permission_request_manager.cc
index b5e45fb..843dd53 100644
--- a/chrome/browser/permissions/permission_request_manager.cc
+++ b/chrome/browser/permissions/permission_request_manager.cc
@@ -14,6 +14,7 @@
 #include "chrome/browser/permissions/permission_request.h"
 #include "chrome/browser/permissions/permission_uma_util.h"
 #include "chrome/browser/ui/permission_bubble/permission_prompt.h"
+#include "chrome/browser/vr/vr_tab_helper.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/chrome_switches.h"
 #include "content/public/browser/browser_thread.h"
@@ -127,6 +128,8 @@
 }
 
 void PermissionRequestManager::AddRequest(PermissionRequest* request) {
+  DCHECK(!vr::VrTabHelper::IsInVr(web_contents()));
+
   // TODO(tsergeant): change the UMA to no longer mention bubbles.
   base::RecordAction(base::UserMetricsAction("PermissionBubbleRequest"));
 
diff --git a/chrome/browser/profiling_host/profiling_process_host.cc b/chrome/browser/profiling_host/profiling_process_host.cc
index fafcf47..4a43658c 100644
--- a/chrome/browser/profiling_host/profiling_process_host.cc
+++ b/chrome/browser/profiling_host/profiling_process_host.cc
@@ -28,6 +28,9 @@
 #include "base/files/scoped_file.h"
 #include "base/process/process_metrics.h"
 #include "base/third_party/valgrind/valgrind.h"
+#include "chrome/common/profiling/profiling_constants.h"
+#include "content/public/browser/file_descriptor_info.h"
+#include "mojo/public/cpp/system/platform_handle.h"
 #endif
 
 namespace profiling {
@@ -94,6 +97,12 @@
 // static
 void ProfilingProcessHost::AddSwitchesToChildCmdLine(
     base::CommandLine* child_cmd_line) {
+  // TODO(ajwong): Figure out how to trace the zygote process.
+  if (child_cmd_line->GetSwitchValueASCII(switches::kProcessType) ==
+      switches::kZygoteProcess) {
+    return;
+  }
+
   // Watch out: will be called on different threads.
   ProfilingProcessHost* pph = ProfilingProcessHost::Get();
   if (!pph)
@@ -105,6 +114,37 @@
   child_cmd_line->AppendSwitchASCII(switches::kMemlogPipe, pph->pipe_id_);
 }
 
+#if defined(OS_POSIX) && !defined(OS_MACOSX)
+void ProfilingProcessHost::GetAdditionalMappedFilesForChildProcess(
+    const base::CommandLine& command_line,
+    int child_process_id,
+    content::FileDescriptorInfo* mappings) {
+  // TODO(ajwong): Figure out how to trace the zygote process.
+  if (command_line.GetSwitchValueASCII(switches::kProcessType) ==
+      switches::kZygoteProcess) {
+    return;
+  }
+
+  ProfilingProcessHost* pph = ProfilingProcessHost::Get();
+  if (!pph)
+    return;
+
+  pph->EnsureControlChannelExists();
+
+  mojo::edk::PlatformChannelPair data_channel;
+  mappings->Transfer(
+      kProfilingDataPipe,
+      base::ScopedFD(data_channel.PassClientHandle().release().handle));
+
+  content::BrowserThread::GetTaskRunnerForThread(content::BrowserThread::IO)
+      ->PostTask(
+          FROM_HERE,
+          base::BindOnce(&ProfilingProcessHost::AddNewSenderOnIO,
+                         base::Unretained(pph), data_channel.PassServerHandle(),
+                         child_process_id));
+}
+#endif  // defined(OS_POSIX) && !defined(OS_MACOSX)
+
 void ProfilingProcessHost::Launch() {
   mojo::edk::PlatformChannelPair control_channel;
   mojo::edk::HandlePassingInformation handle_passing_info;
@@ -185,4 +225,11 @@
   StartProfilingMojo();
 }
 
+void ProfilingProcessHost::AddNewSenderOnIO(
+    mojo::edk::ScopedPlatformHandle handle,
+    int child_process_id) {
+  profiling_control_->AddNewSender(
+      mojo::WrapPlatformFile(handle.release().handle), child_process_id);
+}
+
 }  // namespace profiling
diff --git a/chrome/browser/profiling_host/profiling_process_host.h b/chrome/browser/profiling_host/profiling_process_host.h
index 46eeebd..14d3dc5 100644
--- a/chrome/browser/profiling_host/profiling_process_host.h
+++ b/chrome/browser/profiling_host/profiling_process_host.h
@@ -7,6 +7,7 @@
 
 #include "base/macros.h"
 #include "base/process/process.h"
+#include "build/build_config.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/profiling/profiling_control.mojom.h"
 #include "mojo/edk/embedder/scoped_platform_handle.h"
@@ -19,7 +20,13 @@
 
 namespace base {
 class CommandLine;
-}
+}  // namespace base
+
+#if defined(OS_POSIX) && !defined(OS_MACOSX)
+namespace content {
+class FileDescriptorInfo;
+}  // namespace content
+#endif  // defined(OS_POSIX) && !defined(OS_MACOSX)
 
 namespace profiling {
 
@@ -51,6 +58,13 @@
   // same mode (either profiling or not) as the browser process.
   static void AddSwitchesToChildCmdLine(base::CommandLine* child_cmd_line);
 
+#if defined(OS_POSIX) && !defined(OS_MACOSX)
+  static void GetAdditionalMappedFilesForChildProcess(
+      const base::CommandLine& command_line,
+      int child_process_id,
+      content::FileDescriptorInfo* mappings);
+#endif  // defined(OS_POSIX) && !defined(OS_MACOSX)
+
  private:
   ProfilingProcessHost();
   ~ProfilingProcessHost();
@@ -59,6 +73,8 @@
 
   void EnsureControlChannelExists();
   void ConnectControlChannelOnIO();
+  void AddNewSenderOnIO(mojo::edk::ScopedPlatformHandle handle,
+                        int child_process_id);
 
   // Use process_.IsValid() to determine if the child process has been launched.
   base::Process process_;
diff --git a/chrome/browser/shell_integration_win.cc b/chrome/browser/shell_integration_win.cc
index 3836d9d..2350866 100644
--- a/chrome/browser/shell_integration_win.cc
+++ b/chrome/browser/shell_integration_win.cc
@@ -609,25 +609,11 @@
 // error (or if Firefox is not found)it returns the default value which
 // is false.
 bool IsFirefoxDefaultBrowser() {
-  bool ff_default = false;
-  if (base::win::GetVersion() >= base::win::VERSION_VISTA) {
-    base::string16 app_cmd;
-    base::win::RegKey key(HKEY_CURRENT_USER,
-                          ShellUtil::kRegVistaUrlPrefs, KEY_READ);
-    if (key.Valid() && (key.ReadValue(L"Progid", &app_cmd) == ERROR_SUCCESS) &&
-        app_cmd == L"FirefoxURL")
-      ff_default = true;
-  } else {
-    base::string16 key_path(L"http");
-    key_path.append(ShellUtil::kRegShellOpen);
-    base::win::RegKey key(HKEY_CLASSES_ROOT, key_path.c_str(), KEY_READ);
-    base::string16 app_cmd;
-    if (key.Valid() && (key.ReadValue(L"", &app_cmd) == ERROR_SUCCESS) &&
-        base::string16::npos !=
-        base::ToLowerASCII(app_cmd).find(L"firefox"))
-      ff_default = true;
-  }
-  return ff_default;
+  base::string16 app_cmd;
+  base::win::RegKey key(HKEY_CURRENT_USER, ShellUtil::kRegVistaUrlPrefs,
+                        KEY_READ);
+  return key.Valid() && key.ReadValue(L"Progid", &app_cmd) == ERROR_SUCCESS &&
+         app_cmd == L"FirefoxURL";
 }
 
 DefaultWebClientState IsDefaultProtocolClient(const std::string& protocol) {
diff --git a/chrome/browser/spellchecker/spellcheck_custom_dictionary_unittest.cc b/chrome/browser/spellchecker/spellcheck_custom_dictionary_unittest.cc
index 14e9cf3..8c9c19e 100644
--- a/chrome/browser/spellchecker/spellcheck_custom_dictionary_unittest.cc
+++ b/chrome/browser/spellchecker/spellcheck_custom_dictionary_unittest.cc
@@ -35,11 +35,6 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-#if defined(OS_WIN)
-// For version specific disabled tests below (http://crbug.com/230534).
-#include "base/win/windows_version.h"
-#endif
-
 using base::HistogramBase;
 using base::HistogramSamples;
 using base::StatisticsRecorder;
@@ -1138,12 +1133,14 @@
             server_custom_dictionary->GetWords().size());
 }
 
-TEST_F(SpellcheckCustomDictionaryTest, RecordSizeStatsCorrectly) {
 #if defined(OS_WIN)
-// Failing consistently on Win7. See crbug.com/230534.
-  if (base::win::GetVersion() >= base::win::VERSION_VISTA)
-    return;
+// Failing consistently on Win7+. See crbug.com/230534.
+#define MAYBE_RecordSizeStatsCorrectly DISABLED_RecordSizeStatsCorrectly
+#else
+#define MAYBE_RecordSizeStatsCorrectly RecordSizeStatsCorrectly
 #endif
+
+TEST_F(SpellcheckCustomDictionaryTest, MAYBE_RecordSizeStatsCorrectly) {
   // Record a baseline.
   SpellCheckHostMetrics::RecordCustomWordCountStats(123);
 
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_browsertest.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_browsertest.cc
index cf195728..4ef87da1 100644
--- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_browsertest.cc
+++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_browsertest.cc
@@ -717,22 +717,29 @@
   EXPECT_FALSE(window1->GetBaseWindow()->IsMaximized());
 
   // Creating a second window of the same type should change the behavior so
-  // that a click does not change the activation state.
+  // that a click on the shelf item does not change the activation state.
   AppWindow* window1a = CreateAppWindow(browser()->profile(), extension1);
+  EXPECT_TRUE(window1->GetNativeWindow()->IsVisible());
   EXPECT_TRUE(window1a->GetNativeWindow()->IsVisible());
+  EXPECT_FALSE(window1->GetBaseWindow()->IsActive());
   EXPECT_TRUE(window1a->GetBaseWindow()->IsActive());
+
+  // Ensure the same shelf item and delegate are used for |window1a|.
+  EXPECT_EQ(item1.id, GetLastLauncherItem().id);
+  EXPECT_EQ(item1_delegate, GetShelfItemDelegate(GetLastLauncherItem().id));
+
   // The first click does nothing.
   SelectItem(item1_delegate, ui::ET_MOUSE_PRESSED);
   EXPECT_TRUE(window1->GetNativeWindow()->IsVisible());
   EXPECT_TRUE(window1a->GetNativeWindow()->IsVisible());
-  EXPECT_TRUE(window1->GetBaseWindow()->IsActive());
-  EXPECT_FALSE(window1a->GetBaseWindow()->IsActive());
+  EXPECT_FALSE(window1->GetBaseWindow()->IsActive());
+  EXPECT_TRUE(window1a->GetBaseWindow()->IsActive());
   // The second neither.
   SelectItem(item1_delegate, ui::ET_MOUSE_PRESSED);
   EXPECT_TRUE(window1->GetNativeWindow()->IsVisible());
   EXPECT_TRUE(window1a->GetNativeWindow()->IsVisible());
-  EXPECT_TRUE(window1->GetBaseWindow()->IsActive());
-  EXPECT_FALSE(window1a->GetBaseWindow()->IsActive());
+  EXPECT_FALSE(window1->GetBaseWindow()->IsActive());
+  EXPECT_TRUE(window1a->GetBaseWindow()->IsActive());
 }
 
 // Confirm that ash::ShelfWindowWatcher correctly handles app panels.
diff --git a/chrome/browser/ui/ash/launcher/extension_app_window_launcher_controller.cc b/chrome/browser/ui/ash/launcher/extension_app_window_launcher_controller.cc
index 869d2d1..a876bc9 100644
--- a/chrome/browser/ui/ash/launcher/extension_app_window_launcher_controller.cc
+++ b/chrome/browser/ui/ash/launcher/extension_app_window_launcher_controller.cc
@@ -78,20 +78,7 @@
 
 void ExtensionAppWindowLauncherController::OnAppWindowAdded(
     extensions::AppWindow* app_window) {
-  // TODO(msw): Determine why this only seems to be called in Mash. Setting the
-  // ShelfItemType as early as possible is important on Mash, to prevent Ash's
-  // ShelfWindowWatcher from creating a conflicting ShelfItem. Set the item type
-  // here for the mash config, and later on in RegisterApp for classic ash.
-  if (chromeos::GetAshConfig() != ash::Config::MASH)
-    return;
-
-  const ash::ShelfID shelf_id = GetShelfId(app_window);
-  DCHECK(!shelf_id.IsNull());
-  aura::Window* window = app_window->GetNativeWindow();
-  window->SetProperty<int>(
-      ash::kShelfItemTypeKey,
-      app_window->window_type_is_panel() ? ash::TYPE_APP_PANEL : ash::TYPE_APP);
-  window->SetProperty(ash::kShelfIDKey, new std::string(shelf_id.Serialize()));
+  RegisterApp(app_window);
 }
 
 void ExtensionAppWindowLauncherController::OnAppWindowShown(
@@ -122,15 +109,10 @@
   const ash::ShelfID shelf_id = GetShelfId(app_window);
   DCHECK(!shelf_id.IsNull());
 
-  // TODO(msw): Determine why OnAppWindowAdded only seems to be called in Mash.
-  if (chromeos::GetAshConfig() != ash::Config::MASH) {
-    window->SetProperty(ash::kShelfIDKey,
-                        new std::string(shelf_id.Serialize()));
-    window->SetProperty<int>(ash::kShelfItemTypeKey,
-                             app_window->window_type_is_panel()
-                                 ? ash::TYPE_APP_PANEL
-                                 : ash::TYPE_APP);
-  }
+  window->SetProperty(ash::kShelfIDKey, new std::string(shelf_id.Serialize()));
+  window->SetProperty<int>(
+      ash::kShelfItemTypeKey,
+      app_window->window_type_is_panel() ? ash::TYPE_APP_PANEL : ash::TYPE_APP);
 
   // Windows created by IME extension should be treated the same way as the
   // virtual keyboard window, which does not register itself in launcher.
diff --git a/chrome/browser/ui/ash/launcher/extension_app_window_launcher_controller.h b/chrome/browser/ui/ash/launcher/extension_app_window_launcher_controller.h
index 8258cd5..d5f24a1 100644
--- a/chrome/browser/ui/ash/launcher/extension_app_window_launcher_controller.h
+++ b/chrome/browser/ui/ash/launcher/extension_app_window_launcher_controller.h
@@ -54,10 +54,10 @@
   void OnWindowDestroying(aura::Window* window) override;
 
  protected:
-  // Registers a app window with the shelf and this object.
+  // Registers an app window with the shelf and this object.
   void RegisterApp(extensions::AppWindow* app_window);
 
-  // Unregisters a app window with the shelf and this object.
+  // Unregisters an app window with the shelf and this object.
   void UnregisterApp(aura::Window* window);
 
   // Check if a given window is known to the launcher controller.
diff --git a/chrome/browser/ui/ash/launcher/multi_profile_app_window_launcher_controller.cc b/chrome/browser/ui/ash/launcher/multi_profile_app_window_launcher_controller.cc
index fea64653..b3b55d1f 100644
--- a/chrome/browser/ui/ash/launcher/multi_profile_app_window_launcher_controller.cc
+++ b/chrome/browser/ui/ash/launcher/multi_profile_app_window_launcher_controller.cc
@@ -30,10 +30,8 @@
 MultiProfileAppWindowLauncherController::
     ~MultiProfileAppWindowLauncherController() {
   // We need to remove all Registry observers for added users.
-  for (AppWindowRegistryList::iterator it = multi_user_registry_.begin();
-       it != multi_user_registry_.end();
-       ++it)
-    (*it)->RemoveObserver(this);
+  for (extensions::AppWindowRegistry* registry : multi_user_registry_)
+    registry->RemoveObserver(this);
 }
 
 void MultiProfileAppWindowLauncherController::ActiveUserChanged(
@@ -42,10 +40,7 @@
   // show / hide them one by one. To avoid that a user dependent state
   // "survives" in a launcher item, we first delete all items making sure that
   // nothing remains and then re-create them again.
-  for (AppWindowList::iterator it = app_window_list_.begin();
-       it != app_window_list_.end();
-       ++it) {
-    extensions::AppWindow* app_window = *it;
+  for (extensions::AppWindow* app_window : app_window_list_) {
     Profile* profile =
         Profile::FromBrowserContext(app_window->browser_context());
     if (!multi_user_util::IsProfileFromActiveUser(profile)) {
@@ -58,17 +53,14 @@
       }
     }
   }
-  for (AppWindowList::iterator it = app_window_list_.begin();
-       it != app_window_list_.end();
-       ++it) {
-    extensions::AppWindow* app_window = *it;
+  for (extensions::AppWindow* app_window : app_window_list_) {
     Profile* profile =
         Profile::FromBrowserContext(app_window->browser_context());
     if (multi_user_util::IsProfileFromActiveUser(profile) &&
         !IsRegisteredApp(app_window->GetNativeWindow()) &&
         (app_window->GetBaseWindow()->IsMinimized() ||
          app_window->GetNativeWindow()->IsVisible()))
-      RegisterApp(*it);
+      RegisterApp(app_window);
   }
 }
 
@@ -86,13 +78,20 @@
     extensions::AppWindow* app_window) {
   app_window_list_.push_back(app_window);
   Profile* profile = Profile::FromBrowserContext(app_window->browser_context());
-  // If the window got created for a non active user but the user allowed to
-  // teleport to the current user's desktop, we teleport it now.
+  // If the window was created for an inactive user, but the user allowed the
+  // app to teleport to the current user's desktop, teleport this window now.
   if (!multi_user_util::IsProfileFromActiveUser(profile) &&
       UserHasAppOnActiveDesktop(app_window)) {
     chrome::MultiUserWindowManager::GetInstance()->ShowWindowForUser(
         app_window->GetNativeWindow(), multi_user_util::GetCurrentAccountId());
   }
+
+  // If the window was created for the active user or it has been teleported to
+  // the current user's desktop, register it to show an item on the shelf.
+  if (multi_user_util::IsProfileFromActiveUser(profile) ||
+      UserHasAppOnActiveDesktop(app_window)) {
+    RegisterApp(app_window);
+  }
 }
 
 void MultiProfileAppWindowLauncherController::OnAppWindowShown(
@@ -147,10 +146,7 @@
   const AccountId current_account_id = multi_user_util::GetCurrentAccountId();
   chrome::MultiUserWindowManager* manager =
       chrome::MultiUserWindowManager::GetInstance();
-  for (AppWindowList::iterator it = app_window_list_.begin();
-       it != app_window_list_.end();
-       ++it) {
-    extensions::AppWindow* other_window = *it;
+  for (extensions::AppWindow* other_window : app_window_list_) {
     DCHECK(!other_window->browser_context()->IsOffTheRecord());
     if (manager->IsWindowOnDesktopOfUser(other_window->GetNativeWindow(),
                                          current_account_id) &&
diff --git a/chrome/browser/ui/ash/system_tray_client.cc b/chrome/browser/ui/ash/system_tray_client.cc
index b74be5a..a6da2d3 100644
--- a/chrome/browser/ui/ash/system_tray_client.cc
+++ b/chrome/browser/ui/ash/system_tray_client.cc
@@ -211,8 +211,8 @@
     params.mus_properties[WindowManager::kContainerId_InitProperty] =
         mojo::ConvertTo<std::vector<uint8_t>>(container_id);
   } else {
-    params.parent = ash::Shell::GetContainer(ash::Shell::GetPrimaryRootWindow(),
-                                             container_id);
+    params.parent = ash::Shell::GetContainer(
+        ash::Shell::GetRootWindowForNewWindows(), container_id);
   }
   Widget* widget = new Widget;  // Owned by native widget.
   widget->Init(params);
@@ -370,9 +370,7 @@
     return;
   }
 
-  // Dialog will default to the primary display.
-  chromeos::NetworkConfigView::ShowForNetworkId(network_id,
-                                                nullptr /* parent */);
+  chromeos::NetworkConfigView::ShowForNetworkId(network_id);
 }
 
 void SystemTrayClient::ShowNetworkCreate(const std::string& type) {
@@ -381,7 +379,7 @@
     chromeos::ChooseMobileNetworkDialog::ShowDialogInContainer(container_id);
     return;
   }
-  chromeos::NetworkConfigView::ShowForType(type, nullptr /* parent */);
+  chromeos::NetworkConfigView::ShowForType(type);
 }
 
 void SystemTrayClient::ShowThirdPartyVpnCreate(
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc
index c068168..2ff90bcd 100644
--- a/chrome/browser/ui/browser.cc
+++ b/chrome/browser/ui/browser.cc
@@ -146,6 +146,7 @@
 #include "chrome/browser/ui/webui/signin/login_ui_service_factory.h"
 #include "chrome/browser/ui/window_sizer/window_sizer.h"
 #include "chrome/browser/upgrade_detector.h"
+#include "chrome/browser/vr/vr_tab_helper.h"
 #include "chrome/common/chrome_constants.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/custom_handlers/protocol_handler.h"
@@ -1787,6 +1788,11 @@
   if (context->IsOffTheRecord())
     return;
 
+  // Permission request UI cannot currently be rendered binocularly in VR mode,
+  // so we suppress the UI. crbug.com/736568
+  if (vr::VrTabHelper::IsInVr(web_contents))
+    return;
+
   ProtocolHandler handler =
       ProtocolHandler::CreateProtocolHandler(protocol, url);
 
diff --git a/chrome/browser/ui/browser_focus_uitest.cc b/chrome/browser/ui/browser_focus_uitest.cc
index 10ed864..d7d6ec0 100644
--- a/chrome/browser/ui/browser_focus_uitest.cc
+++ b/chrome/browser/ui/browser_focus_uitest.cc
@@ -49,10 +49,6 @@
 #include "content/public/test/test_navigation_observer.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
 
-#if defined(OS_WIN)
-#include "base/win/windows_version.h"
-#endif
-
 using content::RenderViewHost;
 using content::WebContents;
 
@@ -93,10 +89,6 @@
 #if defined(OS_MACOSX)
     // TODO(msw): Mac requires ui::VKEY_BACKTAB for reverse cycling. Sigh...
     key = reverse ? ui::VKEY_BACKTAB : ui::VKEY_TAB;
-#elif defined(OS_WIN)
-    // This loop times out on Windows XP with no output. http://crbug.com/376635
-    if (base::win::GetVersion() < base::win::VERSION_VISTA)
-      return;
 #endif
 
     // Loop through the focus chain twice for good measure.
diff --git a/chrome/browser/ui/cocoa/browser_window_touch_bar.mm b/chrome/browser/ui/cocoa/browser_window_touch_bar.mm
index daa014a6..a03603e 100644
--- a/chrome/browser/ui/cocoa/browser_window_touch_bar.mm
+++ b/chrome/browser/ui/cocoa/browser_window_touch_bar.mm
@@ -183,8 +183,7 @@
 - (NSView*)backOrForwardTouchBarView;
 
 // Creates and returns the search button.
-- (NSView*)searchTouchBarView
-    __attribute__((availability(macos, introduced = 10.12)));
+- (NSView*)searchTouchBarView API_AVAILABLE(macos(10.12));
 @end
 
 @implementation BrowserWindowTouchBar
diff --git a/chrome/browser/ui/cocoa/tabs/tab_strip_view.mm b/chrome/browser/ui/cocoa/tabs/tab_strip_view.mm
index a0b4a5e..ab07dd1 100644
--- a/chrome/browser/ui/cocoa/tabs/tab_strip_view.mm
+++ b/chrome/browser/ui/cocoa/tabs/tab_strip_view.mm
@@ -355,8 +355,7 @@
   newTabButton_.reset([button retain]);
 }
 
-- (NSVisualEffectView*)visualEffectView
-    __attribute__((availability(macos, introduced = 10.10))) {
+- (NSVisualEffectView*)visualEffectView API_AVAILABLE(macos(10.10)) {
   return [[BrowserWindowController
       browserWindowControllerForWindow:[self window]] visualEffectView];
 }
diff --git a/chrome/browser/ui/cocoa/tabs/tab_window_controller.h b/chrome/browser/ui/cocoa/tabs/tab_window_controller.h
index fba29da..a8c312a3b 100644
--- a/chrome/browser/ui/cocoa/tabs/tab_window_controller.h
+++ b/chrome/browser/ui/cocoa/tabs/tab_window_controller.h
@@ -14,6 +14,7 @@
 
 #import <Cocoa/Cocoa.h>
 
+#include "base/mac/availability.h"
 #include "base/mac/scoped_nsobject.h"
 
 @class FastResizeView;
@@ -29,9 +30,8 @@
   base::scoped_nsobject<NSView> tabStripBackgroundView_;
 
   // Used to blur the titlebar. nil if window does not have titlebar.
-  __attribute__((availability(macos, introduced = 10.10)))
-  base::scoped_nsobject<NSVisualEffectView>
-      visualEffectView_;
+  API_AVAILABLE(macos(10.10))
+  base::scoped_nsobject<NSVisualEffectView> visualEffectView_;
 
   // The tab strip overlaps the titlebar of the window.
   base::scoped_nsobject<TabStripView> tabStripView_;
@@ -54,8 +54,7 @@
   BOOL closeDeferred_;  // If YES, call performClose: in removeOverlay:.
 }
 
-@property(readonly, nonatomic)
-    __attribute__((availability(macos, introduced=10.10)))
+@property(readonly, nonatomic) API_AVAILABLE(macos(10.10))
     NSVisualEffectView* visualEffectView;
 @property(readonly, nonatomic) NSView* tabStripBackgroundView;
 @property(readonly, nonatomic) TabStripView* tabStripView;
diff --git a/chrome/browser/ui/views/constrained_window_views_browsertest.cc b/chrome/browser/ui/views/constrained_window_views_browsertest.cc
index 5538e473..c236f3fc 100644
--- a/chrome/browser/ui/views/constrained_window_views_browsertest.cc
+++ b/chrome/browser/ui/views/constrained_window_views_browsertest.cc
@@ -23,10 +23,6 @@
 #include "ui/views/focus/focus_manager.h"
 #include "ui/views/widget/widget.h"
 
-#if defined(OS_WIN)
-#include "base/win/windows_version.h"
-#endif
-
 namespace {
 
 class TestDialog : public views::DialogDelegateView {
@@ -169,12 +165,6 @@
 
 // Tests that the dialog closes when the escape key is pressed.
 IN_PROC_BROWSER_TEST_F(ConstrainedWindowViewTest, ClosesOnEscape) {
-#if defined(OS_WIN)
-  // TODO(msw): The widget is not made NULL on XP. http://crbug.com/177482
-  if (base::win::GetVersion() < base::win::VERSION_VISTA)
-    return;
-#endif
-
   std::unique_ptr<TestDialog> dialog =
       ShowModalDialog(browser()->tab_strip_model()->GetActiveWebContents());
   EXPECT_TRUE(dialog->GetWidget()->IsVisible());
diff --git a/chrome/browser/ui/views/elevation_icon_setter.cc b/chrome/browser/ui/views/elevation_icon_setter.cc
index bdd02ee..60e606d 100644
--- a/chrome/browser/ui/views/elevation_icon_setter.cc
+++ b/chrome/browser/ui/views/elevation_icon_setter.cc
@@ -13,7 +13,6 @@
 #include <windows.h>
 #include <shellapi.h>
 #include "base/win/win_util.h"
-#include "base/win/windows_version.h"
 #include "ui/display/win/dpi.h"
 #include "ui/gfx/icon_util.h"
 #endif
@@ -26,8 +25,7 @@
 std::unique_ptr<SkBitmap> GetElevationIcon() {
   std::unique_ptr<SkBitmap> icon;
 #if defined(OS_WIN)
-  if ((base::win::GetVersion() < base::win::VERSION_VISTA) ||
-      !base::win::UserAccountControlIsEnabled())
+  if (!base::win::UserAccountControlIsEnabled())
     return icon;
 
   SHSTOCKICONINFO icon_info = { sizeof(SHSTOCKICONINFO) };
diff --git a/chrome/browser/ui/views/payments/payment_request_views_util.cc b/chrome/browser/ui/views/payments/payment_request_views_util.cc
index c014b168..7a3365c 100644
--- a/chrome/browser/ui/views/payments/payment_request_views_util.cc
+++ b/chrome/browser/ui/views/payments/payment_request_views_util.cc
@@ -288,7 +288,10 @@
   base::string16 missing = comp.GetStringForMissingShippingFields(profile);
   if (!missing.empty()) {
     base_label->AddChildView(GetLabelForMissingInformation(missing).release());
+    *accessible_content = l10n_util::GetStringFUTF16(
+        IDS_PAYMENTS_ACCESSIBLE_LABEL_WITH_ERROR, *accessible_content, missing);
   }
+
   return base_label;
 }
 
@@ -323,6 +326,8 @@
   base::string16 missing = comp.GetStringForMissingContactFields(profile);
   if (!missing.empty()) {
     base_label->AddChildView(GetLabelForMissingInformation(missing).release());
+    *accessible_content = l10n_util::GetStringFUTF16(
+        IDS_PAYMENTS_ACCESSIBLE_LABEL_WITH_ERROR, *accessible_content, missing);
   }
   return base_label;
 }
diff --git a/chrome/browser/ui/views/status_icons/status_icon_win.cc b/chrome/browser/ui/views/status_icons/status_icon_win.cc
index 7b98969be..47aa3c9 100644
--- a/chrome/browser/ui/views/status_icons/status_icon_win.cc
+++ b/chrome/browser/ui/views/status_icons/status_icon_win.cc
@@ -7,7 +7,6 @@
 #include <string.h>
 
 #include "base/strings/string_number_conversions.h"
-#include "base/win/windows_version.h"
 #include "chrome/browser/ui/views/status_icons/status_tray_win.h"
 #include "third_party/skia/include/core/SkBitmap.h"
 #include "ui/gfx/geometry/point.h"
@@ -128,17 +127,10 @@
   wcscpy_s(icon_data.szInfo, contents.c_str());
   icon_data.uTimeout = 0;
 
-  base::win::Version win_version = base::win::GetVersion();
-  if (!icon.isNull() && win_version != base::win::VERSION_PRE_XP) {
+  if (!icon.isNull()) {
     balloon_icon_ = IconUtil::CreateHICONFromSkBitmap(*icon.bitmap());
-    if (win_version >= base::win::VERSION_VISTA) {
-      icon_data.hBalloonIcon = balloon_icon_.get();
-      icon_data.dwInfoFlags = NIIF_USER | NIIF_LARGE_ICON;
-    } else {
-      icon_data.hIcon = balloon_icon_.get();
-      icon_data.uFlags |= NIF_ICON;
-      icon_data.dwInfoFlags = NIIF_USER;
-    }
+    icon_data.hBalloonIcon = balloon_icon_.get();
+    icon_data.dwInfoFlags = NIIF_USER | NIIF_LARGE_ICON;
   }
 
   BOOL result = Shell_NotifyIcon(NIM_MODIFY, &icon_data);
@@ -162,13 +154,8 @@
 }
 
 void StatusIconWin::InitIconData(NOTIFYICONDATA* icon_data) {
-  if (base::win::GetVersion() >= base::win::VERSION_VISTA) {
-    memset(icon_data, 0, sizeof(NOTIFYICONDATA));
-    icon_data->cbSize = sizeof(NOTIFYICONDATA);
-  } else {
-    memset(icon_data, 0, NOTIFYICONDATA_V3_SIZE);
-    icon_data->cbSize = NOTIFYICONDATA_V3_SIZE;
-  }
+  memset(icon_data, 0, sizeof(NOTIFYICONDATA));
+  icon_data->cbSize = sizeof(NOTIFYICONDATA);
 
   icon_data->hWnd = window_;
   icon_data->uID = icon_id_;
diff --git a/chrome/browser/ui/views/status_icons/status_tray_state_changer_interactive_uitest_win.cc b/chrome/browser/ui/views/status_icons/status_tray_state_changer_interactive_uitest_win.cc
index a0b9d8b6..868d188 100644
--- a/chrome/browser/ui/views/status_icons/status_tray_state_changer_interactive_uitest_win.cc
+++ b/chrome/browser/ui/views/status_icons/status_tray_state_changer_interactive_uitest_win.cc
@@ -7,7 +7,6 @@
 
 #include "base/macros.h"
 #include "base/win/scoped_com_initializer.h"
-#include "base/win/windows_version.h"
 #include "chrome/browser/status_icons/status_icon.h"
 #include "chrome/browser/ui/views/status_icons/status_icon_win.h"
 #include "chrome/browser/ui/views/status_icons/status_tray_state_changer_win.h"
@@ -125,12 +124,6 @@
 // Test is disabled due to multiple COM initialization errors.  See
 // http//crbug.com/367199 for details.
 TEST_F(StatusTrayStateChangerWinTest, DISABLED_TraySizeApiTest) {
-
-  // The tray does not auto-hide icons immediately on Vista so this test does
-  // not detect a size change.
-  if (base::win::GetVersion() <= base::win::VERSION_VISTA)
-    return;
-
   // Used to reset operating system state afterwards.
   std::unique_ptr<NOTIFYITEM> notify_item = SetupAndGetCurrentNotifyItem();
   // We can't actually run this test if we're already showing the icon.
diff --git a/chrome/browser/ui/webui/chromeos/login/network_dropdown_handler.cc b/chrome/browser/ui/webui/chromeos/login/network_dropdown_handler.cc
index fdfbf203..faeb18f 100644
--- a/chrome/browser/ui/webui/chromeos/login/network_dropdown_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/network_dropdown_handler.cc
@@ -79,8 +79,7 @@
 }
 
 void NetworkDropdownHandler::HandleLaunchAddWiFiNetworkDialog() {
-  gfx::NativeWindow native_window = GetNativeWindow();
-  NetworkConfigView::ShowForType(shill::kTypeWifi, native_window);
+  NetworkConfigView::ShowForType(shill::kTypeWifi);
 }
 
 void NetworkDropdownHandler::HandleLaunchAddMobileNetworkDialog() {
diff --git a/chrome/browser/ui/webui/chromeos/network_ui.cc b/chrome/browser/ui/webui/chromeos/network_ui.cc
index 46ca4649..dbf5a40 100644
--- a/chrome/browser/ui/webui/chromeos/network_ui.cc
+++ b/chrome/browser/ui/webui/chromeos/network_ui.cc
@@ -144,8 +144,7 @@
     std::string shill_type = (onc_type == ::onc::network_type::kVPN)
                                  ? shill::kTypeVPN
                                  : shill::kTypeWifi;
-    NetworkConfigView::ShowForType(
-        shill_type, web_ui()->GetWebContents()->GetTopLevelNativeWindow());
+    NetworkConfigView::ShowForType(shill_type);
   }
 
   base::WeakPtrFactory<NetworkConfigMessageHandler> weak_ptr_factory_;
diff --git a/chrome/browser/ui/webui/help/version_updater_win.cc b/chrome/browser/ui/webui/help/version_updater_win.cc
index 43bcd59..9824fcb 100644
--- a/chrome/browser/ui/webui/help/version_updater_win.cc
+++ b/chrome/browser/ui/webui/help/version_updater_win.cc
@@ -8,7 +8,6 @@
 #include "base/task_runner_util.h"
 #include "base/threading/sequenced_worker_pool.h"
 #include "base/win/win_util.h"
-#include "base/win/windows_version.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/first_run/upgrade_util.h"
 #include "chrome/grit/generated_resources.h"
@@ -31,17 +30,8 @@
   // There is no supported integration with Google Update for Chromium.
   callback_ = callback;
 
-  // On-demand updates for Chrome don't work in Vista RTM when UAC is turned
-  // off. So, in this case, the version updater must not mention
-  // on-demand updates. Silent updates (in the background) should still
-  // work as before - enabling UAC or installing the latest service pack
-  // for Vista is another option.
-  if (!(base::win::GetVersion() == base::win::VERSION_VISTA &&
-        (base::win::OSInfo::GetInstance()->service_pack().major == 0) &&
-        !base::win::UserAccountControlIsEnabled())) {
-    callback_.Run(CHECKING, 0, std::string(), 0, base::string16());
-    BeginUpdateCheckOnFileThread(false /* !install_update_if_possible */);
-  }
+  callback_.Run(CHECKING, 0, std::string(), 0, base::string16());
+  BeginUpdateCheckOnFileThread(false /* !install_update_if_possible */);
 }
 
 void VersionUpdaterWin::OnUpdateCheckComplete(
diff --git a/chrome/browser/ui/webui/media_router/media_router_file_dialog.cc b/chrome/browser/ui/webui/media_router/media_router_file_dialog.cc
index b9012aa..3d2ee7e 100644
--- a/chrome/browser/ui/webui/media_router/media_router_file_dialog.cc
+++ b/chrome/browser/ui/webui/media_router/media_router_file_dialog.cc
@@ -227,22 +227,11 @@
   std::string issue_title;
   switch (validation_result) {
     case MediaRouterFileDialog::FILE_MISSING:
-      issue_title = l10n_util::GetStringFUTF8(
-          IDS_MEDIA_ROUTER_ISSUE_FILE_CAST_FILE_MISSING,
-          GetFileName(file_info));
-      break;
     case MediaRouterFileDialog::FILE_EMPTY:
-      issue_title = l10n_util::GetStringFUTF8(
-          IDS_MEDIA_ROUTER_ISSUE_FILE_CAST_NOT_MEDIA, GetFileName(file_info));
-      break;
     case MediaRouterFileDialog::FILE_TYPE_NOT_SUPPORTED:
-      issue_title = l10n_util::GetStringFUTF8(
-          IDS_MEDIA_ROUTER_ISSUE_FILE_CAST_NOT_SUPPORTED,
-          GetFileName(file_info));
-      break;
     case MediaRouterFileDialog::READ_FAILURE:
       issue_title = l10n_util::GetStringFUTF8(
-          IDS_MEDIA_ROUTER_ISSUE_FILE_CAST_READ_ERROR, GetFileName(file_info));
+          IDS_MEDIA_ROUTER_ISSUE_FILE_CAST_ERROR, GetFileName(file_info));
       break;
     case MediaRouterFileDialog::FILE_OK:
       // Create issue shouldn't be called with FILE_OK, but to ensure things
diff --git a/chrome/browser/ui/webui/media_router/media_router_file_dialog_unittest.cc b/chrome/browser/ui/webui/media_router/media_router_file_dialog_unittest.cc
index ccca3a53..3f644663 100644
--- a/chrome/browser/ui/webui/media_router/media_router_file_dialog_unittest.cc
+++ b/chrome/browser/ui/webui/media_router/media_router_file_dialog_unittest.cc
@@ -68,7 +68,6 @@
  public:
   MediaRouterFileDialogTest() {
     fake_path = base::FilePath(FILE_PATH_LITERAL("im/a/fake_path.mp3"));
-    fake_path_name = fake_path.BaseName().LossyDisplayName();
 
     scoped_feature_list_.InitFromCommandLine(
         "EnableCastLocalMedia" /* enabled features */,
@@ -96,9 +95,13 @@
         .WillByDefault(Return(1));
   }
 
-  void FileSelectedExpectFailure(base::FilePath fake_path, std::string title) {
-    EXPECT_CALL(*mock_delegate_,
-                FileDialogSelectionFailed(Field(&IssueInfo::title, title)));
+  void FileSelectedExpectFailure(base::FilePath fake_path) {
+    fake_path_name = fake_path.BaseName().LossyDisplayName();
+    std::string error_title = l10n_util::GetStringFUTF8(
+        IDS_MEDIA_ROUTER_ISSUE_FILE_CAST_ERROR, fake_path_name);
+
+    EXPECT_CALL(*mock_delegate_, FileDialogSelectionFailed(
+                                     Field(&IssueInfo::title, error_title)));
 
     dialog_as_listener_->FileSelected(fake_path, 0, 0);
 
@@ -156,50 +159,35 @@
   EXPECT_CALL(*mock_file_system_delegate, FileExists(fake_path))
       .WillOnce(Return(false));
 
-  FileSelectedExpectFailure(
-      fake_path,
-      l10n_util::GetStringFUTF8(IDS_MEDIA_ROUTER_ISSUE_FILE_CAST_FILE_MISSING,
-                                fake_path_name));
+  FileSelectedExpectFailure(fake_path);
 }
 
 TEST_F(MediaRouterFileDialogTest, SelectFailureFileDoesNotContainContent) {
   EXPECT_CALL(*mock_file_system_delegate, GetFileSize(fake_path))
       .WillOnce(Return(0));
 
-  FileSelectedExpectFailure(
-      fake_path,
-      l10n_util::GetStringFUTF8(IDS_MEDIA_ROUTER_ISSUE_FILE_CAST_NOT_MEDIA,
-                                fake_path_name));
+  FileSelectedExpectFailure(fake_path);
 }
 
 TEST_F(MediaRouterFileDialogTest, SelectFailureCannotReadGetFileSize) {
   EXPECT_CALL(*mock_file_system_delegate, GetFileSize(fake_path))
       .WillOnce(Return(-1));
 
-  FileSelectedExpectFailure(
-      fake_path,
-      l10n_util::GetStringFUTF8(IDS_MEDIA_ROUTER_ISSUE_FILE_CAST_READ_ERROR,
-                                fake_path_name));
+  FileSelectedExpectFailure(fake_path);
 }
 
 TEST_F(MediaRouterFileDialogTest, SelectFailureCannotReadFile) {
   EXPECT_CALL(*mock_file_system_delegate, IsFileReadable(fake_path))
       .WillOnce(Return(false));
 
-  FileSelectedExpectFailure(
-      fake_path,
-      l10n_util::GetStringFUTF8(IDS_MEDIA_ROUTER_ISSUE_FILE_CAST_READ_ERROR,
-                                fake_path_name));
+  FileSelectedExpectFailure(fake_path);
 }
 
 TEST_F(MediaRouterFileDialogTest, SelectFailureFileNotSupported) {
   EXPECT_CALL(*mock_file_system_delegate, IsFileTypeSupported(fake_path))
       .WillOnce(Return(false));
 
-  FileSelectedExpectFailure(
-      fake_path,
-      l10n_util::GetStringFUTF8(IDS_MEDIA_ROUTER_ISSUE_FILE_CAST_NOT_SUPPORTED,
-                                fake_path_name));
+  FileSelectedExpectFailure(fake_path);
 }
 
 }  // namespace media_router
diff --git a/chrome/browser/ui/webui/net_internals/net_internals_ui.cc b/chrome/browser/ui/webui/net_internals/net_internals_ui.cc
index c22f0c3..8c6cd04eb 100644
--- a/chrome/browser/ui/webui/net_internals/net_internals_ui.cc
+++ b/chrome/browser/ui/webui/net_internals/net_internals_ui.cc
@@ -1026,7 +1026,7 @@
   std::set<net::URLRequestContext*> contexts;
   for (const auto& getter : context_getters_)
     contexts.insert(getter->GetURLRequestContext());
-  contexts.insert(io_thread_->globals()->system_request_context.get());
+  contexts.insert(io_thread_->globals()->system_request_context);
 
   // Add entries for ongoing network objects.
   CreateNetLogEntriesForActiveObjects(contexts, this);
diff --git a/chrome/browser/ui/webui/options/chromeos/internet_options_handler.cc b/chrome/browser/ui/webui/options/chromeos/internet_options_handler.cc
index 9933d21f..75dab74 100644
--- a/chrome/browser/ui/webui/options/chromeos/internet_options_handler.cc
+++ b/chrome/browser/ui/webui/options/chromeos/internet_options_handler.cc
@@ -183,7 +183,7 @@
 void InternetOptionsHandler::AddVPNConnection(const base::ListValue* args) {
   if (args->empty()) {
     // Show the "add network" dialog for the built-in OpenVPN/L2TP provider.
-    NetworkConfigView::ShowForType(shill::kTypeVPN, GetNativeWindow());
+    NetworkConfigView::ShowForType(shill::kTypeVPN);
     return;
   }
 
@@ -206,7 +206,7 @@
     return;
   }
   if (onc_type == ::onc::network_type::kWiFi) {
-    NetworkConfigView::ShowForType(shill::kTypeWifi, GetNativeWindow());
+    NetworkConfigView::ShowForType(shill::kTypeWifi);
   } else if (onc_type == ::onc::network_type::kCellular) {
     ChooseMobileNetworkDialog::ShowDialog(GetNativeWindow());
   } else {
@@ -246,7 +246,7 @@
     return;
   }
 
-  NetworkConfigView::ShowForNetworkId(guid, GetNativeWindow());
+  NetworkConfigView::ShowForNetworkId(guid);
 }
 
 }  // namespace options
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
index c52327c8..b63e1ec26 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
+++ b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
@@ -669,9 +669,6 @@
   std::string callback_id;
   CHECK(args->GetString(0, &callback_id));
   CHECK(!callback_id.empty());
-
-  AllowJavascript();
-
   printer_backend_proxy()->EnumeratePrinters(
       base::Bind(&PrintPreviewHandler::SetupPrinterList,
                  weak_factory_.GetWeakPtr(), callback_id));
@@ -681,9 +678,6 @@
   std::string callback_id;
   CHECK(args->GetString(0, &callback_id));
   CHECK(!callback_id.empty());
-
-  AllowJavascript();
-
   if (!PrivetPrintingEnabled()) {
     RejectJavascriptCallback(base::Value(callback_id), base::Value());
     return;
@@ -712,8 +706,6 @@
 
 void PrintPreviewHandler::HandleGetPrivetPrinterCapabilities(
     const base::ListValue* args) {
-  AllowJavascript();
-
   std::string callback_id;
   std::string printer_name;
   if (!args->GetString(0, &callback_id) || !args->GetString(1, &printer_name) ||
@@ -738,7 +730,6 @@
   CHECK(args->GetString(0, &callback_id));
   CHECK(!callback_id.empty());
 
-  AllowJavascript();
   EnsureExtensionPrinterHandlerSet();
   // Make sure all in progress requests are canceled before new printer search
   // starts.
@@ -756,7 +747,6 @@
             args->GetString(1, &printer_id) && !callback_id.empty();
   DCHECK(ok);
 
-  AllowJavascript();
   EnsureExtensionPrinterHandlerSet();
   extension_printer_handler_->StartGrantPrinterAccess(
       printer_id, base::Bind(&PrintPreviewHandler::OnGotExtensionPrinterInfo,
@@ -765,8 +755,6 @@
 
 void PrintPreviewHandler::HandleGetExtensionPrinterCapabilities(
     const base::ListValue* args) {
-  AllowJavascript();
-
   std::string callback_id;
   std::string printer_name;
   if (!args->GetString(0, &callback_id) || !args->GetString(1, &printer_name) ||
@@ -878,9 +866,6 @@
   // before printing.
   UMA_HISTOGRAM_COUNTS("PrintPreview.RegeneratePreviewRequest.BeforePrint",
                        regenerate_preview_request_count_);
-
-  AllowJavascript();
-
   std::string callback_id;
   CHECK(args->GetString(0, &callback_id));
   CHECK(!callback_id.empty());
@@ -1127,8 +1112,6 @@
 
 void PrintPreviewHandler::HandleGetPrinterCapabilities(
     const base::ListValue* args) {
-  AllowJavascript();
-
   std::string callback_id;
   std::string printer_name;
   if (!args->GetString(0, &callback_id) || !args->GetString(1, &printer_name) ||
@@ -1158,8 +1141,6 @@
 // |args| is expected to contain a string with representing the callback id
 // followed by a list of arguments the first of which should be the printer id.
 void PrintPreviewHandler::HandlePrinterSetup(const base::ListValue* args) {
-  AllowJavascript();
-
   std::string callback_id;
   std::string printer_name;
   if (!args->GetString(0, &callback_id) || !args->GetString(1, &printer_name) ||
@@ -1203,7 +1184,6 @@
             !callback_id.empty();
   DCHECK(ok);
 
-  AllowJavascript();
   if (!token_service_)
     token_service_ = base::MakeUnique<AccessTokenService>(this);
   token_service_->RequestToken(type, callback_id);
@@ -1904,8 +1884,6 @@
     const std::string& callback_id,
     const base::ListValue& printers,
     bool done) {
-  AllowJavascript();
-
   FireWebUIListener("extension-printers-added", printers);
   if (done) {
     ResolveJavascriptCallback(base::Value(callback_id), base::Value());
diff --git a/chrome/browser/ui/webui/settings/chromeos/internet_handler.cc b/chrome/browser/ui/webui/settings/chromeos/internet_handler.cc
index 1af49e99..c819ff40 100644
--- a/chrome/browser/ui/webui/settings/chromeos/internet_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/internet_handler.cc
@@ -74,7 +74,7 @@
       args->GetString(1, &extension_id);
     if (extension_id.empty()) {
       // Show the "add network" dialog for the built-in OpenVPN/L2TP provider.
-      NetworkConfigView::ShowForType(shill::kTypeVPN, GetNativeWindow());
+      NetworkConfigView::ShowForType(shill::kTypeVPN);
       return;
     }
     // Request that the third-party VPN provider identified by |provider_id|
@@ -82,7 +82,7 @@
     VpnServiceFactory::GetForBrowserContext(GetProfileForPrimaryUser())
         ->SendShowAddDialogToExtension(extension_id);
   } else if (onc_type == ::onc::network_type::kWiFi) {
-    NetworkConfigView::ShowForType(shill::kTypeWifi, GetNativeWindow());
+    NetworkConfigView::ShowForType(shill::kTypeWifi);
   } else if (onc_type == ::onc::network_type::kCellular) {
     ChooseMobileNetworkDialog::ShowDialog(GetNativeWindow());
   } else {
@@ -121,7 +121,7 @@
     return;
   }
 
-  NetworkConfigView::ShowForNetworkId(network->guid(), GetNativeWindow());
+  NetworkConfigView::ShowForNetworkId(network->guid());
 }
 
 gfx::NativeWindow InternetHandler::GetNativeWindow() const {
diff --git a/chrome/browser/vr/BUILD.gn b/chrome/browser/vr/BUILD.gn
index 4ec50df..be11d25b 100644
--- a/chrome/browser/vr/BUILD.gn
+++ b/chrome/browser/vr/BUILD.gn
@@ -14,12 +14,10 @@
 
 static_library("vr_common") {
   sources = [
-    "animation.cc",
-    "animation.h",
+    "animation_player.cc",
+    "animation_player.h",
     "color_scheme.cc",
     "color_scheme.h",
-    "easing.cc",
-    "easing.h",
     "elements/button.cc",
     "elements/button.h",
     "elements/button_texture.cc",
@@ -99,6 +97,7 @@
 
   deps = [
     "//base",
+    "//cc/animation",
     "//cc/paint",
     "//chrome/app:generated_resources",
     "//components/security_state/core",
@@ -117,6 +116,7 @@
 
 test("vr_common_unittests") {
   sources = [
+    "animation_player_unittest.cc",
     "elements/close_button_texture_unittest.cc",
     "elements/exit_prompt_unittest.cc",
     "elements/transience_manager_unittest.cc",
@@ -125,6 +125,8 @@
     "fps_meter_unittest.cc",
     "gltf_parser_unittest.cc",
     "run_all_unittests.cc",
+    "test/animation_utils.cc",
+    "test/animation_utils.h",
     "test/paths.cc",
     "test/paths.h",
     "ui_scene_manager_unittest.cc",
diff --git a/chrome/browser/vr/DEPS b/chrome/browser/vr/DEPS
new file mode 100644
index 0000000..62e96cd
--- /dev/null
+++ b/chrome/browser/vr/DEPS
@@ -0,0 +1,6 @@
+include_rules = [
+  "+cc/animation",
+  "+cc/base",
+  "+cc/test",
+  "+cc/trees",
+]
diff --git a/chrome/browser/vr/animation.cc b/chrome/browser/vr/animation.cc
deleted file mode 100644
index 53483a2..0000000
--- a/chrome/browser/vr/animation.cc
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/vr/animation.h"
-
-#include <utility>
-
-#include "chrome/browser/vr/easing.h"
-
-namespace vr {
-
-Animation::Animation(int id,
-                     Property property,
-                     std::unique_ptr<easing::Easing> easing,
-                     std::vector<float> from,
-                     std::vector<float> to,
-                     const base::TimeTicks& start,
-                     const base::TimeDelta& duration)
-    : id(id),
-      property(property),
-      easing(std::move(easing)),
-      from(from),
-      to(to),
-      start(start),
-      duration(duration) {}
-
-Animation::~Animation() {}
-
-}  // namespace vr
diff --git a/chrome/browser/vr/animation.h b/chrome/browser/vr/animation.h
deleted file mode 100644
index 9ab84b32..0000000
--- a/chrome/browser/vr/animation.h
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_VR_ANIMATION_H_
-#define CHROME_BROWSER_VR_ANIMATION_H_
-
-#include <memory>
-#include <vector>
-
-#include "base/macros.h"
-#include "base/time/time.h"
-
-namespace vr {
-
-namespace easing {
-class Easing;
-}
-
-// Describes the characteristics of a transition from an initial set of values
-// to a final set, with timing and interpolation information.  Other classes use
-// this information to animate UI element location, size, and other properties.
-class Animation {
- public:
-  enum Property {
-    SIZE = 0,
-    TRANSLATION,
-    SCALE,
-    ROTATION,
-    OPACITY,
-  };
-
-  Animation(int id,
-            Property property,
-            std::unique_ptr<easing::Easing> easing,
-            std::vector<float> from,
-            std::vector<float> to,
-            const base::TimeTicks& start,
-            const base::TimeDelta& duration);
-  ~Animation();
-
-  int id;
-  Property property;
-  std::unique_ptr<easing::Easing> easing;
-  std::vector<float> from;
-  std::vector<float> to;
-  base::TimeTicks start;
-  base::TimeDelta duration;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(Animation);
-};
-
-}  // namespace vr
-
-#endif  // CHROME_BROWSER_VR_ANIMATION_H_
diff --git a/chrome/browser/vr/animation_player.cc b/chrome/browser/vr/animation_player.cc
new file mode 100644
index 0000000..26cbaca
--- /dev/null
+++ b/chrome/browser/vr/animation_player.cc
@@ -0,0 +1,82 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/vr/animation_player.h"
+
+#include <algorithm>
+
+#include "base/stl_util.h"
+#include "cc/animation/animation_curve.h"
+#include "cc/animation/animation_player.h"
+#include "cc/animation/animation_target.h"
+#include "cc/base/math_util.h"
+#include "chrome/browser/vr/elements/ui_element.h"
+
+namespace vr {
+AnimationPlayer::AnimationPlayer() {}
+AnimationPlayer::~AnimationPlayer() {}
+
+void AnimationPlayer::AddAnimation(std::unique_ptr<cc::Animation> animation) {
+  animations_.push_back(std::move(animation));
+}
+
+void AnimationPlayer::RemoveAnimation(int animation_id) {
+  base::EraseIf(
+      animations_,
+      [animation_id](const std::unique_ptr<cc::Animation>& animation) {
+        return animation->id() == animation_id;
+      });
+}
+
+void AnimationPlayer::RemoveAnimations(
+    cc::TargetProperty::Type target_property) {
+  base::EraseIf(
+      animations_,
+      [target_property](const std::unique_ptr<cc::Animation>& animation) {
+        return animation->target_property() == target_property;
+      });
+}
+
+void AnimationPlayer::StartAnimations(base::TimeTicks monotonic_time) {
+  // TODO(vollick): support groups. crbug.com/742358
+  cc::TargetProperties animated_properties;
+  for (auto& animation : animations_) {
+    if (animation->run_state() == cc::Animation::STARTING ||
+        animation->run_state() == cc::Animation::RUNNING ||
+        animation->run_state() == cc::Animation::PAUSED) {
+      animated_properties[animation->target_property()] = true;
+    }
+  }
+  for (auto& animation : animations_) {
+    if (!animated_properties[animation->target_property()] &&
+        animation->run_state() ==
+            cc::Animation::WAITING_FOR_TARGET_AVAILABILITY) {
+      animated_properties[animation->target_property()] = true;
+      animation->SetRunState(cc::Animation::STARTING, monotonic_time);
+    }
+  }
+}
+
+void AnimationPlayer::Tick(base::TimeTicks monotonic_time) {
+  DCHECK(target_);
+
+  StartAnimations(monotonic_time);
+
+  for (auto& animation : animations_) {
+    cc::AnimationPlayer::TickAnimation(monotonic_time, animation.get(),
+                                       target_);
+    if (animation->run_state() == cc::Animation::STARTING)
+      animation->SetRunState(cc::Animation::RUNNING, monotonic_time);
+  }
+
+  // Remove finished animations.
+  base::EraseIf(
+      animations_,
+      [monotonic_time](const std::unique_ptr<cc::Animation>& animation) {
+        return !animation->is_finished() &&
+               animation->IsFinishedAt(monotonic_time);
+      });
+}
+
+}  // namespace vr
diff --git a/chrome/browser/vr/animation_player.h b/chrome/browser/vr/animation_player.h
new file mode 100644
index 0000000..097b929
--- /dev/null
+++ b/chrome/browser/vr/animation_player.h
@@ -0,0 +1,57 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_VR_ANIMATION_PLAYER_H_
+#define CHROME_BROWSER_VR_ANIMATION_PLAYER_H_
+
+#include <vector>
+
+#include "base/macros.h"
+#include "cc/animation/animation.h"
+#include "cc/trees/target_property.h"
+
+namespace cc {
+class AnimationTarget;
+}  // namespace cc
+
+namespace vr {
+
+// This is a simplified version of the cc::AnimationPlayer. Its sole purpose is
+// the management of its collection of animations. Ticking them, updating their
+// state, and deleting them as required.
+//
+// TODO(vollick): if cc::Animation and friends move into gfx/, then this class
+// should follow suit. As such, it should not absorb any vr-specific
+// functionality.
+class AnimationPlayer final {
+ public:
+  AnimationPlayer();
+  ~AnimationPlayer();
+
+  cc::AnimationTarget* target() const { return target_; }
+  void set_target(cc::AnimationTarget* target) { target_ = target; }
+
+  // Animations for properties already being animated are enqueued. Animation
+  // groups are not currently supported. crbug.com/742358
+  void AddAnimation(std::unique_ptr<cc::Animation> animation);
+  void RemoveAnimation(int animation_id);
+  void RemoveAnimations(cc::TargetProperty::Type target_property);
+
+  void Tick(base::TimeTicks monotonic_time);
+
+  using Animations = std::vector<std::unique_ptr<cc::Animation>>;
+  const Animations& animations() { return animations_; }
+
+ private:
+  void StartAnimations(base::TimeTicks monotonic_time);
+
+  cc::AnimationTarget* target_ = nullptr;
+  Animations animations_;
+
+  DISALLOW_COPY_AND_ASSIGN(AnimationPlayer);
+};
+
+}  // namespace vr
+
+#endif  //  CHROME_BROWSER_VR_ANIMATION_PLAYER_H_
diff --git a/chrome/browser/vr/animation_player_unittest.cc b/chrome/browser/vr/animation_player_unittest.cc
new file mode 100644
index 0000000..34d17ff
--- /dev/null
+++ b/chrome/browser/vr/animation_player_unittest.cc
@@ -0,0 +1,163 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/vr/animation_player.h"
+
+#include "cc/animation/animation_target.h"
+#include "chrome/browser/vr/test/animation_utils.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/gfx/test/gfx_util.h"
+
+namespace vr {
+
+class TestAnimationTarget : public cc::AnimationTarget {
+ public:
+  TestAnimationTarget() {}
+
+  const gfx::SizeF& size() const { return size_; }
+  const cc::TransformOperations& operations() const { return operations_; }
+
+ private:
+  void NotifyClientBoundsAnimated(const gfx::SizeF& size,
+                                  cc::Animation* animation) override {
+    size_ = size;
+  }
+
+  void NotifyClientTransformOperationsAnimated(
+      const cc::TransformOperations& operations,
+      cc::Animation* animation) override {
+    operations_ = operations;
+  }
+
+  cc::TransformOperations operations_;
+  gfx::SizeF size_;
+};
+
+TEST(AnimationPlayerTest, AddRemoveAnimations) {
+  AnimationPlayer player;
+  EXPECT_TRUE(player.animations().empty());
+
+  player.AddAnimation(CreateBoundsAnimation(
+      1, 1, gfx::SizeF(10, 100), gfx::SizeF(20, 200), UsToDelta(10000)));
+  EXPECT_EQ(1ul, player.animations().size());
+  EXPECT_EQ(cc::TargetProperty::BOUNDS,
+            player.animations()[0]->target_property());
+
+  cc::TransformOperations from_operations;
+  from_operations.AppendTranslate(10, 100, 1000);
+  cc::TransformOperations to_operations;
+  to_operations.AppendTranslate(20, 200, 2000);
+  player.AddAnimation(CreateTransformAnimation(
+      2, 2, from_operations, to_operations, UsToDelta(10000)));
+
+  EXPECT_EQ(2ul, player.animations().size());
+  EXPECT_EQ(cc::TargetProperty::TRANSFORM,
+            player.animations()[1]->target_property());
+
+  player.AddAnimation(CreateTransformAnimation(
+      3, 3, from_operations, to_operations, UsToDelta(10000)));
+  EXPECT_EQ(3ul, player.animations().size());
+  EXPECT_EQ(cc::TargetProperty::TRANSFORM,
+            player.animations()[2]->target_property());
+
+  player.RemoveAnimations(cc::TargetProperty::TRANSFORM);
+  EXPECT_EQ(1ul, player.animations().size());
+  EXPECT_EQ(cc::TargetProperty::BOUNDS,
+            player.animations()[0]->target_property());
+
+  player.RemoveAnimation(player.animations()[0]->id());
+  EXPECT_TRUE(player.animations().empty());
+}
+
+TEST(AnimationPlayerTest, AnimationLifecycle) {
+  TestAnimationTarget target;
+  AnimationPlayer player;
+  player.set_target(&target);
+
+  player.AddAnimation(CreateBoundsAnimation(
+      1, 1, gfx::SizeF(10, 100), gfx::SizeF(20, 200), UsToDelta(10000)));
+  EXPECT_EQ(1ul, player.animations().size());
+  EXPECT_EQ(cc::TargetProperty::BOUNDS,
+            player.animations()[0]->target_property());
+  EXPECT_EQ(cc::Animation::WAITING_FOR_TARGET_AVAILABILITY,
+            player.animations()[0]->run_state());
+
+  base::TimeTicks start_time = UsToTicks(1);
+  player.Tick(start_time);
+  EXPECT_EQ(cc::Animation::RUNNING, player.animations()[0]->run_state());
+
+  EXPECT_SIZEF_EQ(gfx::SizeF(10, 100), target.size());
+
+  // Tick beyond the animation
+  player.Tick(start_time + UsToDelta(20000));
+
+  EXPECT_TRUE(player.animations().empty());
+
+  // Should have assumed the final value.
+  EXPECT_SIZEF_EQ(gfx::SizeF(20, 200), target.size());
+}
+
+TEST(AnimationPlayerTest, AnimationQueue) {
+  TestAnimationTarget target;
+  AnimationPlayer player;
+  player.set_target(&target);
+
+  player.AddAnimation(CreateBoundsAnimation(
+      1, 1, gfx::SizeF(10, 100), gfx::SizeF(20, 200), UsToDelta(10000)));
+  EXPECT_EQ(1ul, player.animations().size());
+  EXPECT_EQ(cc::TargetProperty::BOUNDS,
+            player.animations()[0]->target_property());
+  EXPECT_EQ(cc::Animation::WAITING_FOR_TARGET_AVAILABILITY,
+            player.animations()[0]->run_state());
+
+  base::TimeTicks start_time = UsToTicks(1);
+  player.Tick(start_time);
+  EXPECT_EQ(cc::Animation::RUNNING, player.animations()[0]->run_state());
+  EXPECT_SIZEF_EQ(gfx::SizeF(10, 100), target.size());
+
+  player.AddAnimation(CreateBoundsAnimation(
+      2, 2, gfx::SizeF(10, 100), gfx::SizeF(20, 200), UsToDelta(10000)));
+
+  cc::TransformOperations from_operations;
+  from_operations.AppendTranslate(10, 100, 1000);
+  cc::TransformOperations to_operations;
+  to_operations.AppendTranslate(20, 200, 2000);
+  player.AddAnimation(CreateTransformAnimation(
+      3, 2, from_operations, to_operations, UsToDelta(10000)));
+
+  EXPECT_EQ(3ul, player.animations().size());
+  EXPECT_EQ(cc::TargetProperty::BOUNDS,
+            player.animations()[1]->target_property());
+  EXPECT_EQ(cc::TargetProperty::TRANSFORM,
+            player.animations()[2]->target_property());
+  int id1 = player.animations()[1]->id();
+
+  player.Tick(start_time + UsToDelta(1));
+
+  // Only the transform animation should have started (since there's no
+  // conflicting animation).
+  // TODO(vollick): Once we were to support groups (crbug.com/742358)
+  // these two animations should start together so neither queued animation
+  // should start since there's a running animation blocking one of them.
+  EXPECT_EQ(cc::Animation::WAITING_FOR_TARGET_AVAILABILITY,
+            player.animations()[1]->run_state());
+  EXPECT_EQ(cc::Animation::RUNNING, player.animations()[2]->run_state());
+
+  // Tick beyond the first animation. This should cause it (and the transform
+  // animation) to get removed and for the second bounds animation to start.
+  // TODO(vollick): this will also change when groups are supported
+  // (crbug.com/742358).
+  player.Tick(start_time + UsToDelta(15000));
+
+  EXPECT_EQ(1ul, player.animations().size());
+  EXPECT_EQ(cc::Animation::WAITING_FOR_TARGET_AVAILABILITY,
+            player.animations()[0]->run_state());
+  EXPECT_EQ(id1, player.animations()[0]->id());
+
+  // Tick beyond all animations. There should be none remaining.
+  player.Tick(start_time + UsToDelta(30000));
+  EXPECT_TRUE(player.animations().empty());
+}
+
+}  // namespace vr
diff --git a/chrome/browser/vr/easing.cc b/chrome/browser/vr/easing.cc
deleted file mode 100644
index 5e1c896..0000000
--- a/chrome/browser/vr/easing.cc
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/vr/easing.h"
-
-#include <cmath>
-
-#include "base/logging.h"
-
-namespace vr {
-namespace easing {
-
-double Easing::CalculateValue(double input) {
-  DCHECK(input >= 0.0 && input <= 1.0);
-  return CalculateValueImpl(input);
-}
-
-CubicBezier::CubicBezier(double p1x, double p1y, double p2x, double p2y)
-    : bezier_(p1x, p1y, p2x, p2y) {}
-
-double CubicBezier::CalculateValueImpl(double state) {
-  return bezier_.Solve(state);
-}
-
-EaseIn::EaseIn(double power) : power_(power) {}
-double EaseIn::CalculateValueImpl(double state) {
-  return pow(state, power_);
-}
-
-EaseOut::EaseOut(double power) : power_(power) {}
-double EaseOut::CalculateValueImpl(double state) {
-  return 1.0 - pow(1.0 - state, power_);
-}
-
-EaseInOut::EaseInOut(double power) : ease_in_(power) {}
-double EaseInOut::CalculateValueImpl(double state) {
-  if (state < 0.5) {
-    return ease_in_.CalculateValueImpl(state * 2) / 2;
-  } else {
-    return 1.0 - ease_in_.CalculateValueImpl((1.0 - state) * 2) / 2;
-  }
-}
-
-double Linear::CalculateValueImpl(double state) {
-  return state;
-}
-
-}  // namespace easing
-}  // namespace vr
diff --git a/chrome/browser/vr/easing.h b/chrome/browser/vr/easing.h
deleted file mode 100644
index 6278184d..0000000
--- a/chrome/browser/vr/easing.h
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_VR_EASING_H_
-#define CHROME_BROWSER_VR_EASING_H_
-
-#include "base/macros.h"
-#include "ui/gfx/geometry/cubic_bezier.h"
-
-namespace vr {
-namespace easing {
-
-enum EasingType {
-  LINEAR = 0,
-  CUBICBEZIER,
-  EASEIN,
-  EASEOUT,
-  EASEINOUT,
-};
-
-// Abstract base class for custom interpolators, mapping linear input between
-// 0 and 1 to custom values between those two points.
-class Easing {
- public:
-  // Compute an output value, given an input between 0 and 1. Output will
-  // equal input at (at least) points 0 and 1.
-  double CalculateValue(double input);
-  virtual ~Easing() {}
-
- protected:
-  Easing() {}
-  virtual double CalculateValueImpl(double input) = 0;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(Easing);
-};
-
-// Linear interpolation generates output equal to input.
-class Linear : public Easing {
- public:
-  Linear() = default;
-  double CalculateValueImpl(double input) override;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(Linear);
-};
-
-// Computes a cubic-bezier transition based on two control points.
-class CubicBezier : public Easing {
- public:
-  CubicBezier(double p1x, double p1y, double p2x, double p2y);
-  double CalculateValueImpl(double input) override;
-
- private:
-  gfx::CubicBezier bezier_;
-  DISALLOW_COPY_AND_ASSIGN(CubicBezier);
-};
-
-// Computes |input|^|power|.
-class EaseIn : public Easing {
- public:
-  explicit EaseIn(double power);
-  double CalculateValueImpl(double input) override;
-
- private:
-  double power_;
-  DISALLOW_COPY_AND_ASSIGN(EaseIn);
-};
-
-// Computes 1 - |input|^|power|.
-class EaseOut : public Easing {
- public:
-  explicit EaseOut(double power);
-  double CalculateValueImpl(double input) override;
-
- private:
-  double power_;
-  DISALLOW_COPY_AND_ASSIGN(EaseOut);
-};
-
-// Starts with EaseIn and finishes with EaseOut.
-class EaseInOut : public Easing {
- public:
-  explicit EaseInOut(double power);
-  double CalculateValueImpl(double input) override;
-
- private:
-  EaseIn ease_in_;
-  DISALLOW_COPY_AND_ASSIGN(EaseInOut);
-};
-
-}  // namespace easing
-}  // namespace vr
-
-#endif  // CHROME_BROWSER_VR_EASING_H_
diff --git a/chrome/browser/vr/elements/ui_element.cc b/chrome/browser/vr/elements/ui_element.cc
index 82614f3..8e4d1ca 100644
--- a/chrome/browser/vr/elements/ui_element.cc
+++ b/chrome/browser/vr/elements/ui_element.cc
@@ -8,8 +8,6 @@
 
 #include "base/logging.h"
 #include "base/time/time.h"
-#include "chrome/browser/vr/animation.h"
-#include "chrome/browser/vr/easing.h"
 
 namespace vr {
 
@@ -31,50 +29,14 @@
 
 }  // namespace
 
-gfx::Point3F WorldRectangle::GetCenter() const {
-  gfx::Point3F center;
-  transform_.TransformPoint(&center);
-  return center;
+UiElement::UiElement() {
+  animation_player_.set_target(this);
 }
 
-gfx::PointF WorldRectangle::GetUnitRectangleCoordinates(
-    const gfx::Point3F& world_point) const {
-  // TODO(acondor): Simplify the math in this function.
-  gfx::Point3F origin(0, 0, 0);
-  gfx::Vector3dF x_axis(1, 0, 0);
-  gfx::Vector3dF y_axis(0, 1, 0);
-  transform_.TransformPoint(&origin);
-  transform_.TransformVector(&x_axis);
-  transform_.TransformVector(&y_axis);
-  gfx::Vector3dF origin_to_world = world_point - origin;
-  float x = gfx::DotProduct(origin_to_world, x_axis) /
-            gfx::DotProduct(x_axis, x_axis);
-  float y = gfx::DotProduct(origin_to_world, y_axis) /
-            gfx::DotProduct(y_axis, y_axis);
-  return gfx::PointF(x, y);
+UiElement::~UiElement() {
+  animation_player_.set_target(nullptr);
 }
 
-gfx::Vector3dF WorldRectangle::GetNormal() const {
-  gfx::Vector3dF x_axis(1, 0, 0);
-  gfx::Vector3dF y_axis(0, 1, 0);
-  transform_.TransformVector(&x_axis);
-  transform_.TransformVector(&y_axis);
-  gfx::Vector3dF normal = CrossProduct(y_axis, x_axis);
-  normal.GetNormalized(&normal);
-  return normal;
-}
-
-bool WorldRectangle::GetRayDistance(const gfx::Point3F& ray_origin,
-                                    const gfx::Vector3dF& ray_vector,
-                                    float* distance) const {
-  return GetRayPlaneDistance(ray_origin, ray_vector, GetCenter(), GetNormal(),
-                             distance);
-}
-
-UiElement::UiElement() : rotation_(gfx::Vector3dF(1, 0, 0), 0) {}
-
-UiElement::~UiElement() = default;
-
 void UiElement::Render(UiElementRenderer* renderer,
                        gfx::Transform view_proj_matrix) const {
   NOTREACHED();
@@ -95,89 +57,7 @@
 void UiElement::PrepareToDraw() {}
 
 void UiElement::Animate(const base::TimeTicks& time) {
-  for (auto& it : animations_) {
-    Animation& animation = *it;
-    if (time < animation.start)
-      continue;
-
-    // If |from| is not specified, start at the current values.
-    if (animation.from.size() == 0) {
-      switch (animation.property) {
-        case Animation::SIZE:
-          animation.from.push_back(size_.x());
-          animation.from.push_back(size_.y());
-          break;
-        case Animation::SCALE:
-          animation.from.push_back(scale_.x());
-          animation.from.push_back(scale_.y());
-          animation.from.push_back(scale_.z());
-          break;
-        case Animation::ROTATION:
-          animation.from.push_back(rotation_.x());
-          animation.from.push_back(rotation_.y());
-          animation.from.push_back(rotation_.z());
-          animation.from.push_back(rotation_.w());
-          break;
-        case Animation::TRANSLATION:
-          animation.from.push_back(translation_.x());
-          animation.from.push_back(translation_.y());
-          animation.from.push_back(translation_.z());
-          break;
-        case Animation::OPACITY:
-          animation.from.push_back(opacity_);
-          break;
-      }
-    }
-    CHECK_EQ(animation.from.size(), animation.to.size());
-
-    std::vector<float> values(animation.from.size());
-    for (std::size_t i = 0; i < animation.from.size(); ++i) {
-      if (animation.to[i] == animation.from[i] ||
-          time >= (animation.start + animation.duration)) {
-        values[i] = animation.to[i];
-        continue;
-      }
-      double value = animation.easing->CalculateValue(
-          (time - animation.start).InMillisecondsF() /
-          animation.duration.InMillisecondsF());
-      values[i] =
-          animation.from[i] + (value * (animation.to[i] - animation.from[i]));
-    }
-    switch (animation.property) {
-      case Animation::SIZE:
-        CHECK_EQ(animation.from.size(), 2u);
-        size_.set_x(values[0]);
-        size_.set_y(values[1]);
-        break;
-      case Animation::SCALE:
-        CHECK_EQ(animation.from.size(), 3u);
-        scale_ = {values[0], values[1], values[2]};
-        break;
-      case Animation::ROTATION:
-        CHECK_EQ(animation.from.size(), 4u);
-        rotation_.set_x(values[0]);
-        rotation_.set_y(values[1]);
-        rotation_.set_z(values[2]);
-        rotation_.set_w(values[3]);
-        break;
-      case Animation::TRANSLATION:
-        CHECK_EQ(animation.from.size(), 3u);
-        translation_ = {values[0], values[1], values[2]};
-        break;
-      case Animation::OPACITY:
-        CHECK_EQ(animation.from.size(), 1u);
-        opacity_ = values[0];
-        break;
-    }
-  }
-  for (auto it = animations_.begin(); it != animations_.end();) {
-    const Animation& animation = **it;
-    if (time >= (animation.start + animation.duration)) {
-      it = animations_.erase(it);
-    } else {
-      ++it;
-    }
-  }
+  animation_player_.Tick(time);
 }
 
 bool UiElement::IsVisible() const {
@@ -206,4 +86,60 @@
 
 void UiElement::OnSetMode() {}
 
+gfx::Point3F UiElement::GetCenter() const {
+  gfx::Point3F center;
+  screen_space_transform_.TransformPoint(&center);
+  return center;
+}
+
+gfx::PointF UiElement::GetUnitRectangleCoordinates(
+    const gfx::Point3F& world_point) const {
+  // TODO(acondor): Simplify the math in this function.
+  gfx::Point3F origin(0, 0, 0);
+  gfx::Vector3dF x_axis(1, 0, 0);
+  gfx::Vector3dF y_axis(0, 1, 0);
+  screen_space_transform_.TransformPoint(&origin);
+  screen_space_transform_.TransformVector(&x_axis);
+  screen_space_transform_.TransformVector(&y_axis);
+  gfx::Vector3dF origin_to_world = world_point - origin;
+  float x = gfx::DotProduct(origin_to_world, x_axis) /
+            gfx::DotProduct(x_axis, x_axis);
+  float y = gfx::DotProduct(origin_to_world, y_axis) /
+            gfx::DotProduct(y_axis, y_axis);
+  return gfx::PointF(x, y);
+}
+
+gfx::Vector3dF UiElement::GetNormal() const {
+  gfx::Vector3dF x_axis(1, 0, 0);
+  gfx::Vector3dF y_axis(0, 1, 0);
+  screen_space_transform_.TransformVector(&x_axis);
+  screen_space_transform_.TransformVector(&y_axis);
+  gfx::Vector3dF normal = CrossProduct(y_axis, x_axis);
+  normal.GetNormalized(&normal);
+  return normal;
+}
+
+bool UiElement::GetRayDistance(const gfx::Point3F& ray_origin,
+                               const gfx::Vector3dF& ray_vector,
+                               float* distance) const {
+  return GetRayPlaneDistance(ray_origin, ray_vector, GetCenter(), GetNormal(),
+                             distance);
+}
+
+void UiElement::NotifyClientOpacityAnimated(float opacity,
+                                            cc::Animation* animation) {
+  opacity_ = opacity;
+}
+
+void UiElement::NotifyClientTransformOperationsAnimated(
+    const cc::TransformOperations& operations,
+    cc::Animation* animation) {
+  transform_operations_ = operations;
+}
+
+void UiElement::NotifyClientBoundsAnimated(const gfx::SizeF& size,
+                                           cc::Animation* animation) {
+  set_size({size.width(), size.height(), 1});
+}
+
 }  // namespace vr
diff --git a/chrome/browser/vr/elements/ui_element.h b/chrome/browser/vr/elements/ui_element.h
index c0a00b6..a03b449 100644
--- a/chrome/browser/vr/elements/ui_element.h
+++ b/chrome/browser/vr/elements/ui_element.h
@@ -10,11 +10,15 @@
 #include <vector>
 
 #include "base/macros.h"
+#include "cc/animation/animation_target.h"
+#include "cc/animation/transform_operations.h"
+#include "chrome/browser/vr/animation_player.h"
 #include "chrome/browser/vr/color_scheme.h"
 #include "chrome/browser/vr/elements/ui_element_debug_id.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "ui/gfx/geometry/point3_f.h"
 #include "ui/gfx/geometry/quaternion.h"
+#include "ui/gfx/geometry/size_f.h"
 #include "ui/gfx/geometry/vector3d_f.h"
 #include "ui/gfx/transform.h"
 
@@ -54,39 +58,10 @@
   SELF = 4,
 };
 
-class WorldRectangle {
- public:
-  const gfx::Transform& transform() const { return transform_; }
-  void set_transform(const gfx::Transform& transform) {
-    transform_ = transform;
-  }
-
-  gfx::Point3F GetCenter() const;
-  gfx::Vector3dF GetNormal() const;
-
-  // Computes the distance from |ray_origin| to this rectangles's plane, along
-  // |ray_vector|. Returns true and populates |distance| if the calculation is
-  // possible, and false if the ray is parallel to the plane.
-  bool GetRayDistance(const gfx::Point3F& ray_origin,
-                      const gfx::Vector3dF& ray_vector,
-                      float* distance) const;
-
-  // Projects a 3D world point onto the X and Y axes of the transformed
-  // rectangle, returning 2D coordinates relative to the un-transformed unit
-  // rectangle. This allows beam intersection points to be mapped to sprite
-  // pixel coordinates. Points that fall onto the rectangle will generate X and
-  // Y values on the interval [-0.5, 0.5].
-  gfx::PointF GetUnitRectangleCoordinates(
-      const gfx::Point3F& world_point) const;
-
- private:
-  gfx::Transform transform_;
-};
-
-class UiElement : public WorldRectangle {
+class UiElement : public cc::AnimationTarget {
  public:
   UiElement();
-  virtual ~UiElement();
+  ~UiElement() override;
 
   virtual void PrepareToDraw();
 
@@ -153,21 +128,17 @@
   gfx::Vector3dF size() const { return size_; }
   void set_size(const gfx::Vector3dF& size) { size_ = size; }
 
-  // The scale of the object, and its children.
-  gfx::Vector3dF scale() const { return scale_; }
-  void set_scale(const gfx::Vector3dF& scale) { scale_ = scale; }
-
-  // The rotation of the object, and its children.
-  gfx::Quaternion rotation() const { return rotation_; }
-  void set_rotation(const gfx::Quaternion& rotation) { rotation_ = rotation; }
-
-  // The translation of the object, and its children.  Translation is applied
-  // after rotation and scaling.
-  gfx::Vector3dF translation() const { return translation_; }
-  void set_translation(const gfx::Vector3dF& translation) {
-    translation_ = translation;
+  // This is the local transform. It is inherited by descendants.
+  const cc::TransformOperations& transform_operations() const {
+    return transform_operations_;
   }
 
+  void set_transform_operations(const cc::TransformOperations& operations) {
+    transform_operations_ = operations;
+  }
+
+  AnimationPlayer& animation_player() { return animation_player_; }
+
   // The opacity of the object (between 0.0 and 1.0).
   float opacity() const { return opacity_; }
   void set_opacity(float opacity) { opacity_ = opacity; }
@@ -194,12 +165,6 @@
   YAnchoring y_anchoring() const { return y_anchoring_; }
   void set_y_anchoring(YAnchoring y_anchoring) { y_anchoring_ = y_anchoring; }
 
-  // Animations that affect the properties of the object over time.
-  std::vector<std::unique_ptr<Animation>>& animations() { return animations_; }
-  const std::vector<std::unique_ptr<Animation>>& animations() const {
-    return animations_;
-  }
-
   Fill fill() const { return fill_; }
   void set_fill(Fill fill) { fill_ = fill; }
 
@@ -245,6 +210,40 @@
   void SetMode(ColorScheme::Mode mode);
   ColorScheme::Mode mode() const { return mode_; }
 
+  const gfx::Transform& screen_space_transform() const {
+    return screen_space_transform_;
+  }
+  void set_screen_space_transform(const gfx::Transform& transform) {
+    screen_space_transform_ = transform;
+  }
+
+  gfx::Point3F GetCenter() const;
+  gfx::Vector3dF GetNormal() const;
+
+  // Computes the distance from |ray_origin| to this rectangles's plane, along
+  // |ray_vector|. Returns true and populates |distance| if the calculation is
+  // possible, and false if the ray is parallel to the plane.
+  bool GetRayDistance(const gfx::Point3F& ray_origin,
+                      const gfx::Vector3dF& ray_vector,
+                      float* distance) const;
+
+  // Projects a 3D world point onto the X and Y axes of the transformed
+  // rectangle, returning 2D coordinates relative to the un-transformed unit
+  // rectangle. This allows beam intersection points to be mapped to sprite
+  // pixel coordinates. Points that fall onto the rectangle will generate X and
+  // Y values on the interval [-0.5, 0.5].
+  gfx::PointF GetUnitRectangleCoordinates(
+      const gfx::Point3F& world_point) const;
+
+  // cc::AnimationTarget
+  void NotifyClientOpacityAnimated(float opacity,
+                                   cc::Animation* animation) override;
+  void NotifyClientTransformOperationsAnimated(
+      const cc::TransformOperations& operations,
+      cc::Animation* animation) override;
+  void NotifyClientBoundsAnimated(const gfx::SizeF& size,
+                                  cc::Animation* animation) override;
+
  protected:
   virtual void OnSetMode();
 
@@ -276,16 +275,6 @@
   // The size of the object.  This does not affect children.
   gfx::Vector3dF size_ = {1.0f, 1.0f, 1.0f};
 
-  // The scale of the object, and its children.
-  gfx::Vector3dF scale_ = {1.0f, 1.0f, 1.0f};
-
-  // The rotation of the object, and its children.
-  gfx::Quaternion rotation_;
-
-  // The translation of the object, and its children.  Translation is applied
-  // after rotation and scaling.
-  gfx::Vector3dF translation_ = {0.0f, 0.0f, 0.0f};
-
   // The opacity of the object (between 0.0 and 1.0).
   float opacity_ = 1.0f;
 
@@ -300,8 +289,7 @@
   XAnchoring x_anchoring_ = XAnchoring::XNONE;
   YAnchoring y_anchoring_ = YAnchoring::YNONE;
 
-  // Animations that affect the properties of the object over time.
-  std::vector<std::unique_ptr<Animation>> animations_;
+  AnimationPlayer animation_player_;
 
   Fill fill_ = Fill::NONE;
 
@@ -322,7 +310,15 @@
   // An identifier used for testing and debugging, in lieu of a string.
   UiElementDebugId debug_id_ = UiElementDebugId::kNone;
 
-  gfx::Transform transform_;
+  // This local transform operations. They are inherited by descendants and are
+  // stored as a list of operations rather than a baked transform to make
+  // transitions easier to implement (you may, for example, want to animate just
+  // the translation, but leave the rotation and scale in tact).
+  cc::TransformOperations transform_operations_;
+
+  // This is the combined, local to screen transform. It includes
+  // |inheritable_transform_|, |transform_|, and anchoring adjustments.
+  gfx::Transform screen_space_transform_;
 
   ColorScheme::Mode mode_ = ColorScheme::kModeNormal;
 
diff --git a/chrome/browser/vr/elements/ui_element_unittest.cc b/chrome/browser/vr/elements/ui_element_unittest.cc
index eb22978..04f05a9 100644
--- a/chrome/browser/vr/elements/ui_element_unittest.cc
+++ b/chrome/browser/vr/elements/ui_element_unittest.cc
@@ -7,162 +7,45 @@
 #include <utility>
 
 #include "base/macros.h"
-#include "chrome/browser/vr/animation.h"
-#include "chrome/browser/vr/easing.h"
+#include "cc/animation/animation.h"
+#include "cc/animation/keyframed_animation_curve.h"
+#include "cc/test/geometry_test_utils.h"
+#include "chrome/browser/vr/test/animation_utils.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-#define EXPECT_VEC3F_EQ(a, b)    \
-  EXPECT_FLOAT_EQ(a.x(), b.x()); \
-  EXPECT_FLOAT_EQ(a.y(), b.y()); \
-  EXPECT_FLOAT_EQ(a.z(), b.z());
-
-#define EXPECT_RECTF_EQ(a, b)            \
-  EXPECT_FLOAT_EQ(a.x(), b.x());         \
-  EXPECT_FLOAT_EQ(a.y(), b.y());         \
-  EXPECT_FLOAT_EQ(a.width(), b.width()); \
-  EXPECT_FLOAT_EQ(a.height(), b.height());
-
-#define EXPECT_ROTATION(a, b)    \
-  EXPECT_FLOAT_EQ(a.x(), b.x()); \
-  EXPECT_FLOAT_EQ(a.y(), b.y()); \
-  EXPECT_FLOAT_EQ(a.z(), b.z()); \
-  EXPECT_FLOAT_EQ(a.w(), b.w());
-
 namespace vr {
 
-namespace {
-
-base::TimeTicks usToTicks(uint64_t us) {
-  return base::TimeTicks::FromInternalValue(us);
-}
-
-base::TimeDelta usToDelta(uint64_t us) {
-  return base::TimeDelta::FromInternalValue(us);
-}
-
-}  // namespace
-
 TEST(UiElements, AnimateSize) {
   UiElement rect;
   rect.set_size({10, 100, 1});
-  std::unique_ptr<Animation> animation(new Animation(
-      0, Animation::Property::SIZE,
-      std::unique_ptr<easing::Easing>(new easing::Linear()),
-      std::vector<float>(), {20, 200}, usToTicks(50000), usToDelta(10000)));
-  rect.animations().emplace_back(std::move(animation));
-  rect.Animate(usToTicks(50000));
-  EXPECT_VEC3F_EQ(gfx::Vector3dF(10, 100, 1), rect.size());
-  rect.Animate(usToTicks(60000));
-  EXPECT_VEC3F_EQ(gfx::Vector3dF(20, 200, 1), rect.size());
+  rect.animation_player().AddAnimation(CreateBoundsAnimation(
+      1, 1, gfx::SizeF(10, 100), gfx::SizeF(20, 200), UsToDelta(10000)));
+  base::TimeTicks start_time = UsToTicks(1);
+  rect.Animate(start_time);
+  EXPECT_VECTOR3DF_EQ(gfx::Vector3dF(10, 100, 1), rect.size());
+  rect.Animate(start_time + UsToDelta(10000));
+  EXPECT_VECTOR3DF_EQ(gfx::Vector3dF(20, 200, 1), rect.size());
 }
 
-TEST(UiElements, AnimateTranslation) {
+TEST(UiElements, AnimationAffectsInheritableTransform) {
   UiElement rect;
-  rect.set_translation({10, 100, 1000});
-  std::unique_ptr<Animation> animation(
-      new Animation(0, Animation::Property::TRANSLATION,
-                    std::unique_ptr<easing::Easing>(new easing::Linear()),
-                    std::vector<float>(), {20, 200, 2000}, usToTicks(50000),
-                    usToDelta(10000)));
-  rect.animations().emplace_back(std::move(animation));
-  rect.Animate(usToTicks(50000));
-  EXPECT_VEC3F_EQ(gfx::Vector3dF(10, 100, 1000), rect.translation());
-  rect.Animate(usToTicks(60000));
-  EXPECT_VEC3F_EQ(gfx::Vector3dF(20, 200, 2000), rect.translation());
-}
 
-TEST(UiElements, AnimateRotation) {
-  UiElement rect;
-  gfx::Quaternion from(gfx::Vector3dF(10, 100, 1000), 10000);
-  gfx::Quaternion to(gfx::Vector3dF(20, 200, 2000), 20000);
-  rect.set_rotation(from);
-  std::unique_ptr<Animation> animation(
-      new Animation(0, Animation::Property::ROTATION,
-                    std::unique_ptr<easing::Easing>(new easing::Linear()),
-                    std::vector<float>(), {to.x(), to.y(), to.z(), to.w()},
-                    usToTicks(50000), usToDelta(10000)));
-  rect.animations().emplace_back(std::move(animation));
-  rect.Animate(usToTicks(50000));
-  EXPECT_ROTATION(from, rect.rotation());
-  rect.Animate(usToTicks(60000));
-  EXPECT_ROTATION(to, rect.rotation());
-}
+  cc::TransformOperations from_operations;
+  from_operations.AppendTranslate(10, 100, 1000);
+  cc::TransformOperations to_operations;
+  to_operations.AppendTranslate(20, 200, 2000);
+  rect.animation_player().AddAnimation(CreateTransformAnimation(
+      2, 2, from_operations, to_operations, UsToDelta(10000)));
 
-TEST(UiElements, AnimationHasNoEffectBeforeScheduledStart) {
-  UiElement rect;
-  std::unique_ptr<Animation> animation(new Animation(
-      0, Animation::Property::TRANSLATION,
-      std::unique_ptr<easing::Easing>(new easing::Linear()), {10, 100, 1000},
-      {20, 200, 2000}, usToTicks(50000), usToDelta(10000)));
-  rect.animations().emplace_back(std::move(animation));
-  rect.Animate(usToTicks(49999));
-  EXPECT_VEC3F_EQ(gfx::Vector3dF(0, 0, 0), rect.translation());
-}
-
-TEST(UiElements, AnimationPurgedWhenDone) {
-  UiElement rect;
-  std::unique_ptr<Animation> animation(new Animation(
-      0, Animation::Property::TRANSLATION,
-      std::unique_ptr<easing::Easing>(new easing::Linear()), {10, 100, 1000},
-      {20, 200, 2000}, usToTicks(50000), usToDelta(10000)));
-  rect.animations().emplace_back(std::move(animation));
-  rect.Animate(usToTicks(60000));
-  EXPECT_EQ(0u, rect.animations().size());
-}
-
-TEST(UiElements, AnimationLinearEasing) {
-  UiElement rect;
-  std::unique_ptr<Animation> animation(new Animation(
-      0, Animation::Property::TRANSLATION,
-      std::unique_ptr<easing::Easing>(new easing::Linear()), {10, 100, 1000},
-      {20, 200, 2000}, usToTicks(50000), usToDelta(10000)));
-  rect.animations().emplace_back(std::move(animation));
-  rect.Animate(usToTicks(50000));
-  EXPECT_VEC3F_EQ(gfx::Vector3dF(10, 100, 1000), rect.translation());
-  rect.Animate(usToTicks(55000));
-  EXPECT_VEC3F_EQ(gfx::Vector3dF(15, 150, 1500), rect.translation());
-  rect.Animate(usToTicks(60000));
-  EXPECT_VEC3F_EQ(gfx::Vector3dF(20, 200, 2000), rect.translation());
-}
-
-TEST(UiElements, AnimationStartFromSpecifiedLocation) {
-  UiElement rect;
-  std::unique_ptr<Animation> animation(new Animation(
-      0, Animation::Property::TRANSLATION,
-      std::unique_ptr<easing::Easing>(new easing::Linear()), {10, 100, 1000},
-      {20, 200, 2000}, usToTicks(50000), usToDelta(10000)));
-  rect.animations().emplace_back(std::move(animation));
-  rect.Animate(usToTicks(50000));
-  EXPECT_VEC3F_EQ(gfx::Vector3dF(10, 100, 1000), rect.translation());
-  rect.Animate(usToTicks(60000));
-  EXPECT_VEC3F_EQ(gfx::Vector3dF(20, 200, 2000), rect.translation());
-}
-
-// Ensure that when a new animation overlaps another of the same type, the
-// newly added animation overrides the original.  For example:
-//   Animation 1:  ? .......... 20
-//   Animation 2:        ?  .......... 50
-//   Result:       0 ... 10 ... 30 ... 50
-TEST(UiElements, AnimationOverlap) {
-  UiElement rect;
-  std::unique_ptr<Animation> animation(
-      new Animation(0, Animation::Property::TRANSLATION,
-                    std::unique_ptr<easing::Easing>(new easing::Linear()),
-                    std::vector<float>(), {20, 200, 2000}, usToTicks(50000),
-                    usToDelta(10000)));
-  std::unique_ptr<Animation> animation2(
-      new Animation(0, Animation::Property::TRANSLATION,
-                    std::unique_ptr<easing::Easing>(new easing::Linear()),
-                    std::vector<float>(), {50, 500, 5000}, usToTicks(55000),
-                    usToDelta(10000)));
-  rect.animations().emplace_back(std::move(animation));
-  rect.animations().emplace_back(std::move(animation2));
-  rect.Animate(usToTicks(55000));
-  EXPECT_VEC3F_EQ(gfx::Vector3dF(10, 100, 1000), rect.translation());
-  rect.Animate(usToTicks(60000));
-  EXPECT_VEC3F_EQ(gfx::Vector3dF(30, 300, 3000), rect.translation());
-  rect.Animate(usToTicks(65000));
-  EXPECT_VEC3F_EQ(gfx::Vector3dF(50, 500, 5000), rect.translation());
+  base::TimeTicks start_time = UsToTicks(1);
+  rect.Animate(start_time);
+  gfx::Point3F p;
+  rect.transform_operations().Apply().TransformPoint(&p);
+  EXPECT_VECTOR3DF_EQ(gfx::Vector3dF(10, 100, 1000), p);
+  p = gfx::Point3F();
+  rect.Animate(start_time + UsToDelta(10000));
+  rect.transform_operations().Apply().TransformPoint(&p);
+  EXPECT_VECTOR3DF_EQ(gfx::Vector3dF(20, 200, 2000), p);
 }
 
 }  // namespace vr
diff --git a/chrome/browser/vr/test/animation_utils.cc b/chrome/browser/vr/test/animation_utils.cc
new file mode 100644
index 0000000..c2df8c9
--- /dev/null
+++ b/chrome/browser/vr/test/animation_utils.cc
@@ -0,0 +1,48 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/vr/test/animation_utils.h"
+
+namespace vr {
+
+std::unique_ptr<cc::Animation> CreateTransformAnimation(
+    int id,
+    int group,
+    const cc::TransformOperations& from,
+    const cc::TransformOperations& to,
+    base::TimeDelta duration) {
+  std::unique_ptr<cc::KeyframedTransformAnimationCurve> curve(
+      cc::KeyframedTransformAnimationCurve::Create());
+  curve->AddKeyframe(
+      cc::TransformKeyframe::Create(base::TimeDelta(), from, nullptr));
+  curve->AddKeyframe(cc::TransformKeyframe::Create(duration, to, nullptr));
+  std::unique_ptr<cc::Animation> animation(cc::Animation::Create(
+      std::move(curve), id, group, cc::TargetProperty::TRANSFORM));
+  return animation;
+}
+
+std::unique_ptr<cc::Animation> CreateBoundsAnimation(int id,
+                                                     int group,
+                                                     const gfx::SizeF& from,
+                                                     const gfx::SizeF& to,
+                                                     base::TimeDelta duration) {
+  std::unique_ptr<cc::KeyframedSizeAnimationCurve> curve(
+      cc::KeyframedSizeAnimationCurve::Create());
+  curve->AddKeyframe(
+      cc::SizeKeyframe::Create(base::TimeDelta(), from, nullptr));
+  curve->AddKeyframe(cc::SizeKeyframe::Create(duration, to, nullptr));
+  std::unique_ptr<cc::Animation> animation(cc::Animation::Create(
+      std::move(curve), id, group, cc::TargetProperty::BOUNDS));
+  return animation;
+}
+
+base::TimeTicks UsToTicks(uint64_t us) {
+  return base::TimeTicks::FromInternalValue(us);
+}
+
+base::TimeDelta UsToDelta(uint64_t us) {
+  return base::TimeDelta::FromInternalValue(us);
+}
+
+}  // namespace vr
diff --git a/chrome/browser/vr/test/animation_utils.h b/chrome/browser/vr/test/animation_utils.h
new file mode 100644
index 0000000..aafb878
--- /dev/null
+++ b/chrome/browser/vr/test/animation_utils.h
@@ -0,0 +1,31 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_VR_TEST_ANIMATION_UTILS_H_
+#define CHROME_BROWSER_VR_TEST_ANIMATION_UTILS_H_
+
+#include "cc/animation/animation.h"
+#include "cc/animation/keyframed_animation_curve.h"
+
+namespace vr {
+
+std::unique_ptr<cc::Animation> CreateTransformAnimation(
+    int id,
+    int group,
+    const cc::TransformOperations& from,
+    const cc::TransformOperations& to,
+    base::TimeDelta duration);
+
+std::unique_ptr<cc::Animation> CreateBoundsAnimation(int id,
+                                                     int group,
+                                                     const gfx::SizeF& from,
+                                                     const gfx::SizeF& to,
+                                                     base::TimeDelta duration);
+
+base::TimeTicks UsToTicks(uint64_t us);
+base::TimeDelta UsToDelta(uint64_t us);
+
+}  // namespace vr
+
+#endif  // CHROME_BROWSER_VR_TEST_ANIMATION_UTILS_H_
diff --git a/chrome/browser/vr/ui_scene.cc b/chrome/browser/vr/ui_scene.cc
index 24dbbea2..98b6bd2 100644
--- a/chrome/browser/vr/ui_scene.cc
+++ b/chrome/browser/vr/ui_scene.cc
@@ -10,8 +10,6 @@
 #include "base/memory/ptr_util.h"
 #include "base/time/time.h"
 #include "base/values.h"
-#include "chrome/browser/vr/animation.h"
-#include "chrome/browser/vr/easing.h"
 #include "chrome/browser/vr/elements/ui_element.h"
 
 namespace vr {
@@ -79,26 +77,14 @@
 }
 
 void UiScene::AddAnimation(int element_id,
-                           std::unique_ptr<Animation> animation) {
+                           std::unique_ptr<cc::Animation> animation) {
   UiElement* element = GetUiElementById(element_id);
-  CHECK_NE(element, nullptr);
-  for (const std::unique_ptr<Animation>& existing : element->animations()) {
-    CHECK_NE(existing->id, animation->id);
-  }
-  element->animations().emplace_back(std::move(animation));
+  element->animation_player().AddAnimation(std::move(animation));
 }
 
 void UiScene::RemoveAnimation(int element_id, int animation_id) {
   UiElement* element = GetUiElementById(element_id);
-  CHECK_NE(element, nullptr);
-  auto& animations = element->animations();
-  for (auto it = animations.begin(); it != animations.end(); ++it) {
-    const Animation& existing_animation = **it;
-    if (existing_animation.id == animation_id) {
-      animations.erase(it);
-      return;
-    }
-  }
+  element->animation_player().RemoveAnimation(animation_id);
 }
 
 void UiScene::OnBeginFrame(const base::TimeTicks& current_time) {
@@ -249,13 +235,8 @@
 
   // Compute an inheritable transformation that can be applied to this element,
   // and it's children, if applicable.
-  gfx::Transform inheritable;
-  inheritable.matrix().postScale(element->scale().x(), element->scale().y(),
-                                 element->scale().z());
-  inheritable.ConcatTransform(gfx::Transform(element->rotation()));
-  inheritable.matrix().postTranslate(element->translation().x(),
-                                     element->translation().y(),
-                                     element->translation().z());
+  gfx::Transform inheritable = element->transform_operations().Apply();
+
   if (parent) {
     ApplyAnchoring(*parent, element->x_anchoring(), element->y_anchoring(),
                    &inheritable);
@@ -268,8 +249,7 @@
   }
 
   transform.ConcatTransform(inheritable);
-
-  element->set_transform(transform);
+  element->set_screen_space_transform(transform);
   element->set_inheritable_transform(inheritable);
   element->set_dirty(false);
 }
diff --git a/chrome/browser/vr/ui_scene.h b/chrome/browser/vr/ui_scene.h
index c640db7..b8fadac 100644
--- a/chrome/browser/vr/ui_scene.h
+++ b/chrome/browser/vr/ui_scene.h
@@ -19,9 +19,12 @@
 class TimeTicks;
 }  // namespace base
 
+namespace cc {
+class Animation;
+}  // namespace cc
+
 namespace vr {
 
-class Animation;
 class UiElement;
 
 class UiScene {
@@ -43,7 +46,7 @@
   void RemoveUiElement(int element_id);
 
   // Add an animation to the scene, on element |element_id|.
-  void AddAnimation(int element_id, std::unique_ptr<Animation> animation);
+  void AddAnimation(int element_id, std::unique_ptr<cc::Animation> animation);
 
   // Remove |animation_id| from element |element_id|.
   void RemoveAnimation(int element_id, int animation_id);
diff --git a/chrome/browser/vr/ui_scene_manager.cc b/chrome/browser/vr/ui_scene_manager.cc
index 9dbf83cb..2e1716b 100644
--- a/chrome/browser/vr/ui_scene_manager.cc
+++ b/chrome/browser/vr/ui_scene_manager.cc
@@ -6,6 +6,7 @@
 
 #include "base/callback.h"
 #include "base/memory/ptr_util.h"
+#include "cc/base/math_util.h"
 #include "chrome/browser/vr/elements/button.h"
 #include "chrome/browser/vr/elements/close_button_texture.h"
 #include "chrome/browser/vr/elements/exclusive_screen_toast.h"
@@ -24,6 +25,7 @@
 #include "chrome/browser/vr/ui_scene.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/vector_icons/vector_icons.h"
+#include "ui/gfx/transform_util.h"
 #include "ui/vector_icons/vector_icons.h"
 
 namespace vr {
@@ -183,12 +185,14 @@
   element->set_id(AllocateId());
   element->set_fill(vr::Fill::NONE);
   element->set_size({kPermanentWarningWidth, kPermanentWarningHeight, 1});
-  element->set_scale({kWarningDistance, kWarningDistance, 1});
-  element->set_translation(
-      gfx::Vector3dF(0, kWarningDistance * sin(kWarningAngleRadians),
-                     -kWarningDistance * cos(kWarningAngleRadians)));
-  element->set_rotation(
-      gfx::Quaternion(gfx::Vector3dF(1, 0, 0), kWarningAngleRadians));
+
+  cc::TransformOperations operations;
+  operations.AppendTranslate(0, kWarningDistance * sin(kWarningAngleRadians),
+                             -kWarningDistance * cos(kWarningAngleRadians));
+  operations.AppendRotate(1, 0, 0, cc::MathUtil::Rad2Deg(kWarningAngleRadians));
+  operations.AppendScale(kWarningDistance, kWarningDistance, 1);
+  element->set_transform_operations(operations);
+
   element->set_visible(false);
   element->set_hit_testable(false);
   element->set_lock_to_fov(true);
@@ -203,8 +207,9 @@
   element->set_id(AllocateId());
   element->set_fill(vr::Fill::NONE);
   element->set_size({kTransientWarningWidth, kTransientWarningHeight, 1});
-  element->set_scale({kWarningDistance, kWarningDistance, 1});
-  element->set_translation({0, 0, -kWarningDistance});
+  operations = cc::TransformOperations();
+  operations.AppendTranslate(0, 0, -kWarningDistance);
+  element->set_transform_operations(operations);
   element->set_visible(false);
   element->set_hit_testable(false);
   element->set_lock_to_fov(true);
@@ -215,8 +220,11 @@
   element->set_id(AllocateId());
   element->set_fill(vr::Fill::NONE);
   element->set_size({kExitWarningWidth, kExitWarningHeight, 1});
-  element->set_scale({kExitWarningDistance, kExitWarningDistance, 1});
-  element->set_translation({0, 0, -kExitWarningDistance});
+
+  operations = cc::TransformOperations();
+  operations.AppendTranslate(0, 0, -kExitWarningDistance);
+  operations.AppendScale(kExitWarningDistance, kExitWarningDistance, 1);
+  element->set_transform_operations(operations);
   element->set_visible(false);
   element->set_hit_testable(false);
   element->set_lock_to_fov(true);
@@ -270,7 +278,9 @@
   element->set_id(AllocateId());
   element->set_fill(vr::Fill::CONTENT);
   element->set_size({kContentWidth, kContentHeight, 1});
-  element->set_translation({0, kContentVerticalOffset, -kContentDistance});
+  cc::TransformOperations operations;
+  operations.AppendTranslate(0, kContentVerticalOffset, -kContentDistance);
+  element->set_transform_operations(operations);
   element->set_visible(false);
   element->set_corner_radius(kContentCornerRadius);
   main_content_ = element.get();
@@ -284,14 +294,17 @@
   element->set_id(AllocateId());
   element->set_fill(vr::Fill::NONE);
   element->set_size({kBackplaneSize, kBackplaneSize, 1.0});
-  element->set_translation({0.0, 0.0, -kTextureOffset});
+  operations = cc::TransformOperations();
+  operations.AppendTranslate(0, 0, -kTextureOffset);
+  element->set_transform_operations(operations);
   element->set_parent_id(main_content_->id());
   content_elements_.push_back(element.get());
   scene_->AddUiElement(std::move(element));
 
   // Limit reticle distance to a sphere based on content distance.
-  scene_->SetBackgroundDistance(main_content_->translation().z() *
-                                -kBackgroundDistanceMultiplier);
+  scene_->SetBackgroundDistance(
+      main_content_->transform_operations().Apply().matrix().get(2, 3) *
+      -kBackgroundDistanceMultiplier);
 }
 
 void UiSceneManager::CreateSplashScreen() {
@@ -302,8 +315,10 @@
   icon->set_id(AllocateId());
   icon->set_hit_testable(false);
   icon->set_size({kSplashScreenIconWidth, kSplashScreenIconHeight, 1.0});
-  icon->set_translation(
-      {0, kSplashScreenIconVerticalOffset, -kSplashScreenDistance});
+  cc::TransformOperations operations;
+  operations.AppendTranslate(0, kSplashScreenIconVerticalOffset,
+                             -kSplashScreenDistance);
+  icon->set_transform_operations(operations);
   splash_screen_icon_ = icon.get();
   scene_->AddUiElement(std::move(icon));
 }
@@ -316,8 +331,10 @@
   element->set_debug_id(kFloor);
   element->set_id(AllocateId());
   element->set_size({kSceneSize, kSceneSize, 1.0});
-  element->set_translation({0.0, -kSceneHeight / 2, 0.0});
-  element->set_rotation(gfx::Quaternion(gfx::Vector3dF(1, 0, 0), -M_PI / 2));
+  cc::TransformOperations operations;
+  operations.AppendTranslate(0.0, -kSceneHeight / 2, 0.0);
+  operations.AppendRotate(1, 0, 0, -90);
+  element->set_transform_operations(operations);
   element->set_fill(vr::Fill::GRID_GRADIENT);
   element->set_draw_phase(0);
   element->set_gridline_count(kFloorGridlineCount);
@@ -330,8 +347,10 @@
   element->set_debug_id(kCeiling);
   element->set_id(AllocateId());
   element->set_size({kSceneSize, kSceneSize, 1.0});
-  element->set_translation({0.0, kSceneHeight / 2, 0.0});
-  element->set_rotation(gfx::Quaternion(gfx::Vector3dF(1, 0, 0), M_PI / 2));
+  operations = cc::TransformOperations();
+  operations.AppendTranslate(0.0, kSceneHeight / 2, 0.0);
+  operations.AppendRotate(1, 0, 0, 90);
+  element->set_transform_operations(operations);
   element->set_fill(vr::Fill::OPAQUE_GRADIENT);
   element->set_draw_phase(0);
   ceiling_ = element.get();
@@ -351,9 +370,10 @@
       base::Bind(&UiSceneManager::OnUnsupportedMode, base::Unretained(this)));
   url_bar->set_debug_id(kUrlBar);
   url_bar->set_id(AllocateId());
-  url_bar->set_translation({0, kUrlBarVerticalOffset, -kUrlBarDistance});
-  url_bar->set_rotation(
-      gfx::Quaternion(gfx::Vector3dF(1, 0, 0), kUrlBarRotationRad));
+  cc::TransformOperations operations;
+  operations.AppendTranslate(0, kUrlBarVerticalOffset, -kUrlBarDistance);
+  operations.AppendRotate(1, 0, 0, cc::MathUtil::Rad2Deg(kUrlBarRotationRad));
+  url_bar->set_transform_operations(operations);
   url_bar->set_size({kUrlBarWidth, kUrlBarHeight, 1});
   url_bar_ = url_bar.get();
   control_elements_.push_back(url_bar.get());
@@ -362,8 +382,10 @@
   auto indicator = base::MakeUnique<LoadingIndicator>(256);
   indicator->set_debug_id(kLoadingIndicator);
   indicator->set_id(AllocateId());
-  indicator->set_translation(
-      {0, kLoadingIndicatorVerticalOffset, kLoadingIndicatorDepthOffset});
+  operations = cc::TransformOperations();
+  operations.AppendTranslate(0, kLoadingIndicatorVerticalOffset,
+                             kLoadingIndicatorDepthOffset);
+  indicator->set_transform_operations(operations);
   indicator->set_size({kLoadingIndicatorWidth, kLoadingIndicatorHeight, 1});
   indicator->set_parent_id(url_bar_->id());
   indicator->set_y_anchoring(YAnchoring::YTOP);
@@ -381,10 +403,11 @@
   url_bar->set_lock_to_fov(true);
   url_bar->set_visible(false);
   url_bar->set_hit_testable(false);
-  url_bar->set_translation(
-      {0, kTransientUrlBarVerticalOffset, -kTransientUrlBarDistance});
-  url_bar->set_rotation(
-      gfx::Quaternion(gfx::Vector3dF(1, 0, 0), kUrlBarRotationRad));
+  cc::TransformOperations operations;
+  operations.AppendTranslate(0, kTransientUrlBarVerticalOffset,
+                             -kTransientUrlBarDistance);
+  operations.AppendRotate(1, 0, 0, cc::MathUtil::Rad2Deg(kUrlBarRotationRad));
+  url_bar->set_transform_operations(operations);
   url_bar->set_size({kTransientUrlBarWidth, kTransientUrlBarHeight, 1});
   transient_url_bar_ = url_bar.get();
   scene_->AddUiElement(std::move(url_bar));
@@ -397,9 +420,11 @@
   element->set_debug_id(kCloseButton);
   element->set_id(AllocateId());
   element->set_fill(vr::Fill::NONE);
-  element->set_translation(
-      gfx::Vector3dF(0, kContentVerticalOffset - (kContentHeight / 2) - 0.3,
-                     -kCloseButtonDistance));
+  cc::TransformOperations operations;
+  operations.AppendTranslate(
+      0, kContentVerticalOffset - (kContentHeight / 2) - 0.3,
+      -kCloseButtonDistance);
+  element->set_transform_operations(operations);
   element->set_size(gfx::Vector3dF(kCloseButtonWidth, kCloseButtonHeight, 1));
   close_button_ = element.get();
   scene_->AddUiElement(std::move(element));
@@ -416,7 +441,9 @@
   element->set_id(AllocateId());
   element->set_fill(vr::Fill::NONE);
   element->set_size({kExitPromptWidth, kExitPromptHeight, 1});
-  element->set_translation({0.0, kExitPromptVerticalOffset, kTextureOffset});
+  cc::TransformOperations operations;
+  operations.AppendTranslate(0.0, kExitPromptVerticalOffset, kTextureOffset);
+  element->set_transform_operations(operations);
   element->set_parent_id(main_content_->id());
   element->set_visible(false);
   exit_prompt_ = element.get();
@@ -430,7 +457,9 @@
   element->set_id(AllocateId());
   element->set_fill(vr::Fill::NONE);
   element->set_size({kExitPromptBackplaneSize, kExitPromptBackplaneSize, 1.0});
-  element->set_translation({0.0, 0.0, -kTextureOffset});
+  operations = cc::TransformOperations();
+  operations.AppendTranslate(0.0, 0.0, -kTextureOffset);
+  element->set_transform_operations(operations);
   element->set_parent_id(exit_prompt_->id());
   exit_prompt_backplane_ = element.get();
   content_elements_.push_back(element.get());
@@ -515,31 +544,38 @@
   // Update content quad parameters depending on fullscreen.
   // TODO(http://crbug.com/642937): Animate fullscreen transitions.
   if (fullscreen_) {
-    main_content_->set_translation(
-        {0, kFullscreenVerticalOffset, -kFullscreenDistance});
+    cc::TransformOperations operations;
+    operations.AppendTranslate(0, kFullscreenVerticalOffset,
+                               -kFullscreenDistance);
+    main_content_->set_transform_operations(operations);
     main_content_->set_size({kFullscreenWidth, kFullscreenHeight, 1});
 
-    close_button_->set_translation(gfx::Vector3dF(
+    operations = cc::TransformOperations();
+    operations.AppendTranslate(
         0, kFullscreenVerticalOffset - (kFullscreenHeight / 2) - 0.35,
-        -kCloseButtonFullscreenDistance));
+        -kCloseButtonFullscreenDistance);
+    close_button_->set_transform_operations(operations);
     close_button_->set_size(gfx::Vector3dF(kCloseButtonFullscreenWidth,
                                            kCloseButtonFullscreenHeight, 1));
   } else {
     // Note that main_content_ is already visible in this case.
-    main_content_->set_translation(
-        {0, kContentVerticalOffset, -kContentDistance});
+    cc::TransformOperations operations;
+    operations.AppendTranslate(0, kContentVerticalOffset, -kContentDistance);
+    main_content_->set_transform_operations(operations);
     main_content_->set_size({kContentWidth, kContentHeight, 1});
-
-    close_button_->set_translation(
-        gfx::Vector3dF(0, kContentVerticalOffset - (kContentHeight / 2) - 0.3,
-                       -kCloseButtonDistance));
+    operations = cc::TransformOperations();
+    operations.AppendTranslate(
+        0, kContentVerticalOffset - (kContentHeight / 2) - 0.3,
+        -kCloseButtonDistance);
+    close_button_->set_transform_operations(operations);
     close_button_->set_size(
         gfx::Vector3dF(kCloseButtonWidth, kCloseButtonHeight, 1));
   }
 
   scene_->SetMode(mode());
-  scene_->SetBackgroundDistance(main_content_->translation().z() *
-                                -kBackgroundDistanceMultiplier);
+  scene_->SetBackgroundDistance(
+      main_content_->transform_operations().Apply().matrix().get(2, 3) *
+      -kBackgroundDistanceMultiplier);
   UpdateBackgroundColor();
 
   transient_url_bar_->SetEnabled(web_vr_autopresentation_ &&
@@ -658,9 +694,10 @@
     if (!indicator->visible())
       continue;
     float width = indicator->size().x();
-    indicator->set_translation({x_position + width / 2,
-                                kIndicatorVerticalOffset,
-                                kIndicatorDistanceOffset});
+    cc::TransformOperations operations;
+    operations.AppendTranslate(x_position + width / 2, kIndicatorVerticalOffset,
+                               kIndicatorDistanceOffset);
+    indicator->set_transform_operations(operations);
     x_position += width + kIndicatorGap;
   }
 }
@@ -672,24 +709,23 @@
   if (fullscreen_ && !web_vr_mode_) {
     // Do not set size again. The size might have been changed by the backing
     // texture size in UpdateElementSize.
-    exclusive_screen_toast_->set_scale(
-        {kFullscreenToastDistance, kFullscreenToastDistance, 1});
-    exclusive_screen_toast_->set_translation(
-        {0,
-         kFullscreenVerticalOffset + kFullscreenHeight / 2 +
-             (kToastOffsetDMM + kToastHeightDMM) * kFullscreenToastDistance,
-         -kFullscreenToastDistance});
-    exclusive_screen_toast_->set_rotation(
-        gfx::Quaternion(gfx::Vector3dF(1, 0, 0), 0.0));
+    cc::TransformOperations operations;
+    operations.AppendTranslate(
+        0,
+        kFullscreenVerticalOffset + kFullscreenHeight / 2 +
+            (kToastOffsetDMM + kToastHeightDMM) * kFullscreenToastDistance,
+        -kFullscreenToastDistance);
+    operations.AppendScale(kFullscreenToastDistance, kFullscreenToastDistance,
+                           1);
+    exclusive_screen_toast_->set_transform_operations(operations);
     exclusive_screen_toast_->set_lock_to_fov(false);
   } else if (web_vr_mode_ && web_vr_show_toast_) {
-    exclusive_screen_toast_->set_scale(
-        {kWebVrToastDistance, kWebVrToastDistance, 1});
-    exclusive_screen_toast_->set_translation(
-        gfx::Vector3dF(0, kWebVrToastDistance * sin(kWebVrAngleRadians),
-                       -kWebVrToastDistance * cos(kWebVrAngleRadians)));
-    exclusive_screen_toast_->set_rotation(
-        gfx::Quaternion(gfx::Vector3dF(1, 0, 0), kWebVrAngleRadians));
+    cc::TransformOperations operations;
+    operations.AppendTranslate(0, kWebVrToastDistance * sin(kWebVrAngleRadians),
+                               -kWebVrToastDistance * cos(kWebVrAngleRadians));
+    operations.AppendRotate(1, 0, 0, cc::MathUtil::Rad2Deg(kWebVrAngleRadians));
+    operations.AppendScale(kWebVrToastDistance, kWebVrToastDistance, 1);
+    exclusive_screen_toast_->set_transform_operations(operations);
     exclusive_screen_toast_->set_lock_to_fov(true);
   }
 }
diff --git a/chrome/browser/vr/ui_scene_unittest.cc b/chrome/browser/vr/ui_scene_unittest.cc
index b9afd76..d106e90 100644
--- a/chrome/browser/vr/ui_scene_unittest.cc
+++ b/chrome/browser/vr/ui_scene_unittest.cc
@@ -11,10 +11,9 @@
 
 #include "base/memory/ptr_util.h"
 #include "base/values.h"
-#include "chrome/browser/vr/animation.h"
-#include "chrome/browser/vr/easing.h"
 #include "chrome/browser/vr/elements/ui_element.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "ui/gfx/transform_util.h"
 
 #define TOLERANCE 0.0001
 
@@ -31,29 +30,12 @@
   return base::TimeTicks::FromInternalValue(us);
 }
 
-base::TimeDelta usToDelta(uint64_t us) {
-  return base::TimeDelta::FromInternalValue(us);
-}
-
 void addElement(UiScene* scene, int id) {
   auto element = base::MakeUnique<UiElement>();
   element->set_id(id);
   scene->AddUiElement(std::move(element));
 }
 
-void addAnimation(UiScene* scene,
-                  int element_id,
-                  int animation_id,
-                  Animation::Property property) {
-  std::unique_ptr<easing::Easing> easing = base::MakeUnique<easing::Linear>();
-  std::vector<float> from;
-  std::vector<float> to = {1, 1, 1, 1};
-  auto animation =
-      base::MakeUnique<Animation>(animation_id, property, std::move(easing),
-                                  from, to, usToTicks(0), usToDelta(1));
-  scene->AddAnimation(element_id, std::move(animation));
-}
-
 }  // namespace
 
 TEST(UiScene, AddRemoveElements) {
@@ -81,29 +63,6 @@
   EXPECT_EQ(scene.GetUiElements().size(), 0u);
 }
 
-TEST(UiScene, AddRemoveAnimations) {
-  UiScene scene;
-  addElement(&scene, 0);
-  auto* element = scene.GetUiElementById(0);
-
-  EXPECT_EQ(element->animations().size(), 0u);
-  addAnimation(&scene, 0, 0, Animation::Property::SIZE);
-  EXPECT_EQ(element->animations().size(), 1u);
-  EXPECT_EQ(element->animations()[0]->property, Animation::Property::SIZE);
-  addAnimation(&scene, 0, 1, Animation::Property::SCALE);
-  EXPECT_EQ(element->animations().size(), 2u);
-  EXPECT_EQ(element->animations()[1]->property, Animation::Property::SCALE);
-
-  scene.RemoveAnimation(0, 0);
-  EXPECT_EQ(element->animations().size(), 1u);
-  EXPECT_EQ(element->animations()[0]->property, Animation::Property::SCALE);
-  scene.RemoveAnimation(0, 1);
-  EXPECT_EQ(element->animations().size(), 0u);
-
-  scene.RemoveAnimation(0, 0);
-  EXPECT_EQ(element->animations().size(), 0u);
-}
-
 // This test creates a parent and child UI element, each with their own
 // transformations, and ensures that the child's computed total transform
 // incorporates the parent's transform as well as its own.
@@ -115,28 +74,32 @@
   auto element = base::MakeUnique<UiElement>();
   element->set_id(0);
   element->set_size({1000, 1000, 1});
-  element->set_scale({3, 3, 1});
-  element->set_rotation(gfx::Quaternion(gfx::Vector3dF(0, 0, 1), M_PI / 2));
-  element->set_translation({6, 1, 0});
+
+  cc::TransformOperations operations;
+  operations.AppendTranslate(6, 1, 0);
+  operations.AppendRotate(0, 0, 1, 180 / 2);
+  operations.AppendScale(3, 3, 1);
+  element->set_transform_operations(operations);
   scene.AddUiElement(std::move(element));
 
   // Add a child to the parent, with different transformations.
   element = base::MakeUnique<UiElement>();
   element->set_id(1);
   element->set_parent_id(0);
-  element->set_size({1, 1, 1});
-  element->set_scale({2, 2, 1});
-  element->set_rotation(gfx::Quaternion(gfx::Vector3dF(0, 0, 1), M_PI / 2));
-  element->set_translation({3, 0, 0});
+  cc::TransformOperations child_operations;
+  child_operations.AppendTranslate(3, 0, 0);
+  child_operations.AppendRotate(0, 0, 1, 180 / 2);
+  child_operations.AppendScale(2, 2, 1);
+  element->set_transform_operations(child_operations);
   scene.AddUiElement(std::move(element));
   const UiElement* child = scene.GetUiElementById(1);
 
   gfx::Point3F origin(0, 0, 0);
   gfx::Point3F point(1, 0, 0);
 
-  scene.OnBeginFrame(usToTicks(0));
-  child->transform().TransformPoint(&origin);
-  child->transform().TransformPoint(&point);
+  scene.OnBeginFrame(usToTicks(1));
+  child->screen_space_transform().TransformPoint(&origin);
+  child->screen_space_transform().TransformPoint(&point);
   EXPECT_VEC3F_NEAR(gfx::Point3F(6, 10, 0), origin);
   EXPECT_VEC3F_NEAR(gfx::Point3F(0, 10, 0), point);
 }
@@ -195,7 +158,9 @@
   auto element = base::MakeUnique<UiElement>();
   element->set_id(0);
   element->set_size({2, 2, 1});
-  element->set_scale({2, 2, 1});
+  cc::TransformOperations operations;
+  operations.AppendScale(2, 2, 1);
+  element->set_transform_operations(operations);
   scene.AddUiElement(std::move(element));
 
   // Add a child to the parent, with anchoring.
diff --git a/chrome/browser/win/enumerate_modules_model.cc b/chrome/browser/win/enumerate_modules_model.cc
index 4b819277..fee6688 100644
--- a/chrome/browser/win/enumerate_modules_model.cc
+++ b/chrome/browser/win/enumerate_modules_model.cc
@@ -37,7 +37,7 @@
 #include "base/version.h"
 #include "base/win/scoped_handle.h"
 #include "base/win/windows_version.h"
-#include "chrome/browser/conflicts/shell_extension_enumerator_win.h"
+#include "chrome/browser/conflicts/enumerate_shell_extensions_win.h"
 #include "chrome/browser/net/service_providers_win.h"
 #include "chrome/common/chrome_constants.h"
 #include "chrome/common/crash_keys.h"
@@ -308,7 +308,7 @@
 void ModuleEnumerator::EnumerateShellExtensions() {
   // The callback is executed synchronously, so the use of base::Unretained is
   // safe.
-  ShellExtensionEnumerator::EnumerateShellExtensionPaths(base::Bind(
+  EnumerateShellExtensionPaths(base::BindRepeating(
       &ModuleEnumerator::OnShellExtensionEnumerated, base::Unretained(this)));
 }
 
diff --git a/chrome/child/child_profiling.cc b/chrome/child/child_profiling.cc
index bdd25f3..0469aa21 100644
--- a/chrome/child/child_profiling.cc
+++ b/chrome/child/child_profiling.cc
@@ -6,9 +6,14 @@
 
 #include "base/debug/profiler.h"
 #include "base/logging.h"
+#include "chrome/common/chrome_features.h"
 #include "gin/public/debug.h"
 #include "v8/include/v8.h"
 
+#if BUILDFLAG(ENABLE_OOP_HEAP_PROFILING)
+#include "chrome/common/profiling/memlog_sender.h"
+#endif
+
 namespace {
 
 base::debug::AddDynamicSymbol add_dynamic_symbol_func = NULL;
@@ -39,6 +44,10 @@
 
 // static
 void ChildProfiling::ProcessStarted() {
+#if BUILDFLAG(ENABLE_OOP_HEAP_PROFILING)
+  profiling::InitMemlogSenderIfNecessary();
+#endif  // ENABLE_OOP_HEAP_PROFILING
+
   // Establish the V8 profiling hooks if we're an instrumented binary.
   if (base::debug::IsBinaryInstrumented()) {
     base::debug::ReturnAddressLocationResolver resolve_func =
diff --git a/chrome/chrome_watcher/BUILD.gn b/chrome/chrome_watcher/BUILD.gn
index 6522aad..c47f8a8 100644
--- a/chrome/chrome_watcher/BUILD.gn
+++ b/chrome/chrome_watcher/BUILD.gn
@@ -60,10 +60,11 @@
     "//base",
     "//base:base_static",
     "//build/config:exe_and_shlib_deps",
-    "//chrome/common",
+    "//chrome/common:non_code_constants",
     "//chrome/install_static:secondary_module",
     "//chrome_elf",
     "//components/browser_watcher",
+    "//content/public/common:static_switches",
   ]
   ldflags = [ "/DEF:" + rebase_path("chrome_watcher.def", root_build_dir) ]
   configs -= [ "//build/config/win:console" ]
diff --git a/chrome/chrome_watcher/chrome_watcher_main.cc b/chrome/chrome_watcher/chrome_watcher_main.cc
index e62e67e5..dbec964 100644
--- a/chrome/chrome_watcher/chrome_watcher_main.cc
+++ b/chrome/chrome_watcher/chrome_watcher_main.cc
@@ -8,6 +8,7 @@
 #include <utility>
 
 #include "base/at_exit.h"
+#include "base/base_switches.h"
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/callback_helpers.h"
@@ -19,6 +20,8 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/message_loop/message_loop.h"
+#include "base/metrics/statistics_recorder.h"
+#include "base/path_service.h"
 #include "base/process/memory.h"
 #include "base/process/process.h"
 #include "base/run_loop.h"
@@ -29,6 +32,7 @@
 #include "base/strings/string_piece.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/synchronization/waitable_event.h"
+#include "base/syslog_logging.h"
 #include "base/threading/platform_thread.h"
 #include "base/threading/thread.h"
 #include "base/threading/thread_task_runner_handle.h"
@@ -37,11 +41,205 @@
 #include "base/win/scoped_handle.h"
 #include "base/win/win_util.h"
 #include "chrome/chrome_watcher/chrome_watcher_main_api.h"
-#include "chrome/common/logging_chrome.h"
+#include "chrome/common/chrome_constants.h"
+#include "chrome/common/chrome_paths.h"  // For chrome::DIR_LOGS
+#include "chrome/common/env_vars.h"
+#include "chrome/common/win/eventlog_messages.h"
 #include "chrome/install_static/initialize_from_primary_module.h"
+#include "chrome/install_static/install_details.h"
 #include "components/browser_watcher/endsession_watcher_window_win.h"
 #include "components/browser_watcher/exit_code_watcher_win.h"
 #include "components/browser_watcher/window_hang_monitor_win.h"
+#include "content/public/common/content_switches.h"
+
+namespace logging {
+
+namespace {
+
+ScopedLogAssertHandler* assert_handler_ = nullptr;
+
+// This should be true for exactly the period between the end of
+// InitChromeLogging() and the beginning of CleanupChromeLogging().
+bool chrome_logging_initialized_ = false;
+
+// Set if we called InitChromeLogging() but failed to initialize.
+bool chrome_logging_failed_ = false;
+
+// Assertion handler for logging errors that occur when dialogs are
+// silenced.  To record a new error, pass the log string associated
+// with that error in the str parameter.
+MSVC_DISABLE_OPTIMIZE();
+void SilentRuntimeAssertHandler(const char* file,
+                                int line,
+                                const base::StringPiece message,
+                                const base::StringPiece stack_trace) {
+  base::debug::BreakDebugger();
+}
+MSVC_ENABLE_OPTIMIZE();
+
+// Suppresses error/assertion dialogs and enables the logging of
+// those errors into silenced_errors_.
+void SuppressDialogs() {
+  assert_handler_ =
+      new ScopedLogAssertHandler(base::Bind(SilentRuntimeAssertHandler));
+
+  UINT new_flags =
+      SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX;
+
+  // Preserve existing error mode, as discussed at http://t/dmea
+  UINT existing_flags = SetErrorMode(new_flags);
+  SetErrorMode(existing_flags | new_flags);
+}
+
+}  // namespace
+
+LoggingDestination DetermineLoggingDestination(
+    const base::CommandLine& command_line) {
+// only use OutputDebugString in debug mode
+#ifdef NDEBUG
+  bool enable_logging = false;
+  const char* kInvertLoggingSwitch = switches::kEnableLogging;
+  const LoggingDestination kDefaultLoggingMode = LOG_TO_FILE;
+#else
+  bool enable_logging = true;
+  const char* kInvertLoggingSwitch = switches::kDisableLogging;
+  const LoggingDestination kDefaultLoggingMode = LOG_TO_ALL;
+#endif
+
+  if (command_line.HasSwitch(kInvertLoggingSwitch))
+    enable_logging = !enable_logging;
+
+  LoggingDestination log_mode;
+  if (enable_logging) {
+    // Let --enable-logging=stderr force only stderr, particularly useful for
+    // non-debug builds where otherwise you can't get logs to stderr at all.
+    if (command_line.GetSwitchValueASCII(switches::kEnableLogging) == "stderr")
+      log_mode = LOG_TO_SYSTEM_DEBUG_LOG;
+    else
+      log_mode = kDefaultLoggingMode;
+  } else {
+    log_mode = LOG_NONE;
+  }
+  return log_mode;
+}
+
+bool GetLogsPath(base::FilePath* result) {
+#ifdef NDEBUG
+  // Release builds write to the data dir. This is a copy of the Windows
+  // implementation of GetDefaultUserDataDirectory().
+  if (!PathService::Get(base::DIR_LOCAL_APP_DATA, result))
+    return false;
+  *result = result->Append(install_static::GetChromeInstallSubDirectory());
+  *result = result->Append(chrome::kUserDataDirname);
+  return true;
+
+#else
+  // Debug builds write next to the binary (in the build tree)
+  return PathService::Get(base::DIR_EXE, result);
+#endif  // NDEBUG
+}
+
+base::FilePath GetLogFileName() {
+  std::string filename;
+  std::unique_ptr<base::Environment> env(base::Environment::Create());
+  if (env->GetVar(env_vars::kLogFileName, &filename) && !filename.empty())
+    return base::FilePath::FromUTF8Unsafe(filename);
+
+  const base::FilePath log_filename(FILE_PATH_LITERAL("chrome_debug.log"));
+  base::FilePath log_path;
+
+  if (GetLogsPath(&log_path)) {
+    log_path = log_path.Append(log_filename);
+    return log_path;
+  } else {
+    // error with path service, just use some default file somewhere
+    return log_filename;
+  }
+}
+
+// This function was mostly copied from InitChromeLogging(). Copying it was
+// necessary to avoid pulling in a long-tail of unneeded code from
+// //chrome/common.
+void InitChromeWatcherLogging(const base::CommandLine& command_line,
+                              OldFileDeletionState delete_old_log_file) {
+  DCHECK(!chrome_logging_initialized_)
+      << "Attempted to initialize logging when it was already initialized.";
+
+  LoggingDestination logging_dest = DetermineLoggingDestination(command_line);
+  LogLockingState log_locking_state = LOCK_LOG_FILE;
+  base::FilePath log_path;
+
+  // Don't resolve the log path unless we need to. Otherwise we leave an open
+  // ALPC handle after sandbox lockdown on Windows.
+  if ((logging_dest & LOG_TO_FILE) != 0) {
+    log_path = GetLogFileName();
+
+  } else {
+    log_locking_state = DONT_LOCK_LOG_FILE;
+  }
+
+  LoggingSettings settings;
+  settings.logging_dest = logging_dest;
+  settings.log_file = log_path.value().c_str();
+  settings.lock_log = log_locking_state;
+  settings.delete_old = delete_old_log_file;
+  bool success = InitLogging(settings);
+
+  if (!success) {
+    DPLOG(ERROR) << "Unable to initialize logging to " << log_path.value();
+    chrome_logging_failed_ = true;
+    return;
+  }
+
+  // Default to showing error dialogs.
+  if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
+          switches::kNoErrorDialogs))
+    SetShowErrorDialogs(true);
+
+  // we want process and thread IDs because we have a lot of things running
+  SetLogItems(true,    // enable_process_id
+              true,    // enable_thread_id
+              true,    // enable_timestamp
+              false);  // enable_tickcount
+
+  // We call running in unattended mode "headless", and allow
+  // headless mode to be configured either by the Environment
+  // Variable or by the Command Line Switch.  This is for
+  // automated test purposes.
+  std::unique_ptr<base::Environment> env(base::Environment::Create());
+  if (env->HasVar(env_vars::kHeadless) ||
+      command_line.HasSwitch(switches::kNoErrorDialogs))
+    SuppressDialogs();
+
+  // Use a minimum log level if the command line asks for one. Ignore this
+  // switch if there's vlog level switch present too (as both of these switches
+  // refer to the same underlying log level, and the vlog level switch has
+  // already been processed inside InitLogging). If there is neither
+  // log level nor vlog level specified, then just leave the default level
+  // (INFO).
+  if (command_line.HasSwitch(switches::kLoggingLevel) &&
+      GetMinLogLevel() >= 0) {
+    std::string log_level =
+        command_line.GetSwitchValueASCII(switches::kLoggingLevel);
+    int level = 0;
+    if (base::StringToInt(log_level, &level) && level >= 0 &&
+        level < LOG_NUM_SEVERITIES) {
+      SetMinLogLevel(level);
+    } else {
+      DLOG(WARNING) << "Bad log level: " << log_level;
+    }
+  }
+
+  // Enable logging to the Windows Event Log.
+  SetEventSource(base::UTF16ToASCII(
+                     install_static::InstallDetails::Get().install_full_name()),
+                 BROWSER_CATEGORY, MSG_LOG_MESSAGE);
+
+  base::StatisticsRecorder::InitLogOnShutdown();
+
+  chrome_logging_initialized_ = true;
+}
+}  // namespace logging
 
 namespace {
 
@@ -201,7 +399,7 @@
   base::CommandLine::Init(0, nullptr);
   const base::CommandLine& cmd_line = *base::CommandLine::ForCurrentProcess();
 
-  logging::InitChromeLogging(cmd_line, logging::APPEND_TO_OLD_LOG_FILE);
+  logging::InitChromeWatcherLogging(cmd_line, logging::APPEND_TO_OLD_LOG_FILE);
   logging::LogEventProvider::Initialize(kChromeWatcherTraceProviderName);
 
   // Arrange to be shut down as late as possible, as we want to outlive
diff --git a/chrome/common/BUILD.gn b/chrome/common/BUILD.gn
index a719b68..385a9f8 100644
--- a/chrome/common/BUILD.gn
+++ b/chrome/common/BUILD.gn
@@ -519,13 +519,27 @@
   output = "$target_gen_dir/chrome_version.h"
 }
 
-static_library("constants") {
+# Separate out the constants that aren't intermingled with or dependent on code
+# so that they can be used without adding any binary bloat.
+static_library("non_code_constants") {
   sources = [
     "chrome_constants.cc",
     "chrome_constants.h",
+    "chrome_icon_resources_win.h",
+    "env_vars.cc",
+    "env_vars.h",
+  ]
+
+  deps = [
+    ":version_header",
+    "//base",
+  ]
+}
+
+static_library("constants") {
+  sources = [
     "chrome_features.cc",
     "chrome_features.h",
-    "chrome_icon_resources_win.h",
     "chrome_paths.cc",
     "chrome_paths.h",
     "chrome_paths_android.cc",
@@ -536,8 +550,6 @@
     "chrome_result_codes.h",
     "chrome_switches.cc",
     "chrome_switches.h",
-    "env_vars.cc",
-    "env_vars.h",
     "pref_font_script_names-inl.h",
     "pref_font_webkit_names.h",
     "pref_names.cc",
@@ -546,6 +558,7 @@
 
   public_deps = [
     ":features",
+    ":non_code_constants",
     "//content/public/common:result_codes",
     "//extensions/features",
     "//printing/features",
diff --git a/chrome/common/chrome_content_client.cc b/chrome/common/chrome_content_client.cc
index 5633f322..05e23a6d 100644
--- a/chrome/common/chrome_content_client.cc
+++ b/chrome/common/chrome_content_client.cc
@@ -9,6 +9,7 @@
 #include <map>
 #include <memory>
 #include <tuple>
+#include <utility>
 
 #include "base/command_line.h"
 #include "base/debug/crash_logging.h"
@@ -591,12 +592,12 @@
 
   schemes->secure_origins = GetSecureOriginWhitelist();
 
-  schemes->no_access_schemes.push_back(chrome::kChromeNativeScheme);
-
   // chrome-native: is a scheme used for placeholder navigations that allow
   // UIs to be drawn with platform native widgets instead of HTML.  These pages
   // should be treated as empty documents that can commit synchronously.
   schemes->empty_document_schemes.push_back(chrome::kChromeNativeScheme);
+  schemes->no_access_schemes.push_back(chrome::kChromeNativeScheme);
+  schemes->secure_schemes.push_back(chrome::kChromeNativeScheme);
 
 #if BUILDFLAG(ENABLE_EXTENSIONS)
   if (extensions::feature_util::ExtensionServiceWorkersEnabled())
diff --git a/chrome/common/chrome_content_client_unittest.cc b/chrome/common/chrome_content_client_unittest.cc
index 67db83ba..ff92040 100644
--- a/chrome/common/chrome_content_client_unittest.cc
+++ b/chrome/common/chrome_content_client_unittest.cc
@@ -13,6 +13,7 @@
 #include "base/threading/platform_thread.h"
 #include "build/build_config.h"
 #include "content/public/common/content_switches.h"
+#include "content/public/common/origin_util.h"
 #include "extensions/common/constants.h"
 #include "ppapi/features/features.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -178,6 +179,8 @@
   url::Origin origin(extension_url);
   EXPECT_EQ("chrome-extension://abcdefghijklmnopqrstuvwxyzabcdef",
             origin.Serialize());
+
+  EXPECT_TRUE(content::IsOriginSecure(GURL("chrome-native://newtab/")));
 }
 
 class OriginTrialInitializationTestThread
diff --git a/chrome/common/profiling/memlog_sender.cc b/chrome/common/profiling/memlog_sender.cc
index 5e6ed8b..9324193 100644
--- a/chrome/common/profiling/memlog_sender.cc
+++ b/chrome/common/profiling/memlog_sender.cc
@@ -5,11 +5,19 @@
 #include "chrome/common/profiling/memlog_sender.h"
 
 #include "base/command_line.h"
+#include "build/build_config.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/profiling/memlog_allocator_shim.h"
 #include "chrome/common/profiling/memlog_sender_pipe.h"
 #include "chrome/common/profiling/memlog_stream.h"
 
+#if defined(OS_POSIX)
+#include "base/posix/global_descriptors.h"
+#include "base/strings/string_number_conversions.h"
+#include "chrome/common/profiling/profiling_constants.h"
+#include "content/public/common/content_switches.h"
+#endif
+
 namespace profiling {
 
 namespace {
@@ -20,10 +28,35 @@
 
 }  // namespace
 
-void InitMemlogSenderIfNecessary(const base::CommandLine& cmdline) {
+void InitMemlogSenderIfNecessary() {
+  const base::CommandLine& cmdline = *base::CommandLine::ForCurrentProcess();
   std::string pipe_id = cmdline.GetSwitchValueASCII(switches::kMemlogPipe);
-  if (!pipe_id.empty())
+  if (!pipe_id.empty()) {
+#if defined(OS_WIN)
     StartMemlogSender(pipe_id);
+#else
+    // TODO(ajwong): The posix value of the kMemlogPipe is bogus. Fix? This
+    // might be true for windows too if everything is done via the launch
+    // handles as opposed to the original code's use of a shared pipe name.
+    //
+    // TODO(ajwong): This still does not work on Mac because the hook to insert
+    // the file mapping is linux only.
+
+    // TODO(ajwong): In posix, the startup sequence does not correctly pass the
+    // file handle down to the gpu process still. Abort if it's a gpu process
+    // for now.
+    if (cmdline.GetSwitchValueASCII(switches::kProcessType) ==
+        switches::kGpuProcess) {
+      return;
+    }
+
+    base::ScopedFD fd(
+        base::GlobalDescriptors::GetInstance()->Get(kProfilingDataPipe));
+    // TODO(ajwong): Change the StartMemlogSender to take a Scoped-somthing
+    // instead of a string to make lifetimes more clear.
+    StartMemlogSender(base::IntToString(fd.release()));
+#endif
+  }
 }
 
 void StartMemlogSender(const std::string& pipe_id) {
diff --git a/chrome/common/profiling/memlog_sender.h b/chrome/common/profiling/memlog_sender.h
index 84c82441..307087c 100644
--- a/chrome/common/profiling/memlog_sender.h
+++ b/chrome/common/profiling/memlog_sender.h
@@ -16,8 +16,8 @@
 namespace profiling {
 
 // Starts the memlog sender pipe if the command line has requested it. The pipe
-// ID will be extracted from the command line argument.
-void InitMemlogSenderIfNecessary(const base::CommandLine& cmdline);
+// ID will be extracted from the CommandLine for the process.
+void InitMemlogSenderIfNecessary();
 
 // Starts the memlog sender pipe with the given ID.
 void StartMemlogSender(const std::string& pipe_id);
diff --git a/chrome/common/profiling/profiling_constants.h b/chrome/common/profiling/profiling_constants.h
index 8d55439e8..ee5bfceb4 100644
--- a/chrome/common/profiling/profiling_constants.h
+++ b/chrome/common/profiling/profiling_constants.h
@@ -5,11 +5,25 @@
 #ifndef CHROME_COMMON_PROFILING_PROFILING_CONSTANTS_H_
 #define CHROME_COMMON_PROFILING_PROFILING_CONSTANTS_H_
 
+#include "build/build_config.h"
+
+#if defined(OS_POSIX)
+#include "content/public/common/content_descriptors.h"
+#endif
+
 namespace profiling {
 
 // Name of the profiling control Mojo service.
 extern const char kProfilingControlPipeName[];
 
+#if defined(OS_POSIX)
+// TODO(ajwong): Hack! This should be located in something
+// global to the chrome module.
+enum {
+  kProfilingDataPipe = kContentIPCDescriptorMax + 1,
+};
+#endif
+
 }  // namespace profiling
 
 #endif  // CHROME_COMMON_PROFILING_PROFILING_CONSTANTS_H_
diff --git a/chrome/installer/setup/setup_main.cc b/chrome/installer/setup/setup_main.cc
index 064412f0..7c3576a4b 100644
--- a/chrome/installer/setup/setup_main.cc
+++ b/chrome/installer/setup/setup_main.cc
@@ -41,7 +41,6 @@
 #include "base/win/scoped_com_initializer.h"
 #include "base/win/scoped_handle.h"
 #include "base/win/win_util.h"
-#include "base/win/windows_version.h"
 #include "chrome/common/chrome_constants.h"
 #include "chrome/common/chrome_paths.h"
 #include "chrome/common/chrome_switches.h"
@@ -1438,8 +1437,7 @@
   }
 
   if (system_install && !IsUserAnAdmin()) {
-    if (base::win::GetVersion() >= base::win::VERSION_VISTA &&
-        !cmd_line.HasSwitch(installer::switches::kRunAsAdmin)) {
+    if (!cmd_line.HasSwitch(installer::switches::kRunAsAdmin)) {
       base::CommandLine new_cmd(base::CommandLine::NO_PROGRAM);
       new_cmd.AppendArguments(cmd_line, true);
       // Append --run-as-admin flag to let the new instance of setup.exe know
diff --git a/chrome/installer/setup/setup_util.cc b/chrome/installer/setup/setup_util.cc
index e8eeb71..748210d 100644
--- a/chrome/installer/setup/setup_util.cc
+++ b/chrome/installer/setup/setup_util.cc
@@ -36,7 +36,6 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/version.h"
 #include "base/win/registry.h"
-#include "base/win/windows_version.h"
 #include "chrome/install_static/install_details.h"
 #include "chrome/install_static/install_modes.h"
 #include "chrome/install_static/install_util.h"
@@ -440,18 +439,18 @@
 }
 
 bool AdjustProcessPriority() {
-  if (base::win::GetVersion() >= base::win::VERSION_VISTA) {
-    DWORD priority_class = ::GetPriorityClass(::GetCurrentProcess());
-    if (priority_class == 0) {
-      PLOG(WARNING) << "Failed to get the process's priority class.";
-    } else if (priority_class == BELOW_NORMAL_PRIORITY_CLASS ||
-               priority_class == IDLE_PRIORITY_CLASS) {
-      BOOL result = ::SetPriorityClass(::GetCurrentProcess(),
-                                       PROCESS_MODE_BACKGROUND_BEGIN);
-      PLOG_IF(WARNING, !result) << "Failed to enter background mode.";
-      return !!result;
-    }
+  DWORD priority_class = ::GetPriorityClass(::GetCurrentProcess());
+  if (priority_class == BELOW_NORMAL_PRIORITY_CLASS ||
+      priority_class == IDLE_PRIORITY_CLASS) {
+    BOOL result = ::SetPriorityClass(::GetCurrentProcess(),
+                                     PROCESS_MODE_BACKGROUND_BEGIN);
+    PLOG_IF(WARNING, !result) << "Failed to enter background mode.";
+    return !!result;
   }
+
+  if (priority_class == 0)
+    PLOG(WARNING) << "Failed to get the process's priority class.";
+
   return false;
 }
 
diff --git a/chrome/installer/setup/setup_util_unittest.cc b/chrome/installer/setup/setup_util_unittest.cc
index b3400b5..216ffb8 100644
--- a/chrome/installer/setup/setup_util_unittest.cc
+++ b/chrome/installer/setup/setup_util_unittest.cc
@@ -26,7 +26,6 @@
 #include "base/version.h"
 #include "base/win/registry.h"
 #include "base/win/scoped_handle.h"
-#include "base/win/windows_version.h"
 #include "chrome/install_static/install_details.h"
 #include "chrome/installer/setup/installer_state.h"
 #include "chrome/installer/setup/setup_constants.h"
@@ -208,10 +207,7 @@
   std::unique_ptr<ScopedPriorityClass> below_normal =
       ScopedPriorityClass::Create(BELOW_NORMAL_PRIORITY_CLASS);
   ASSERT_TRUE(below_normal);
-  if (base::win::GetVersion() > base::win::VERSION_SERVER_2003)
-    EXPECT_EQ(PCCR_CHANGED, RelaunchAndDoProcessPriorityAdjustment());
-  else
-    EXPECT_EQ(PCCR_UNCHANGED, RelaunchAndDoProcessPriorityAdjustment());
+  EXPECT_EQ(PCCR_CHANGED, RelaunchAndDoProcessPriorityAdjustment());
 }
 
 TEST(SetupUtilTest, GetInstallAge) {
diff --git a/chrome/installer/setup/uninstall.cc b/chrome/installer/setup/uninstall.cc
index 12e4d1a..1224fc1 100644
--- a/chrome/installer/setup/uninstall.cc
+++ b/chrome/installer/setup/uninstall.cc
@@ -28,7 +28,6 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/win/registry.h"
 #include "base/win/shortcut.h"
-#include "base/win/windows_version.h"
 #include "chrome/common/chrome_constants.h"
 #include "chrome/common/chrome_paths.h"
 #include "chrome/common/chrome_result_codes.h"
@@ -833,7 +832,6 @@
     if (remove_all &&
         ShellUtil::QuickIsChromeRegisteredInHKLM(chrome_exe, suffix) &&
         !::IsUserAnAdmin() &&
-        base::win::GetVersion() >= base::win::VERSION_VISTA &&
         !cmd_line.HasSwitch(installer::switches::kRunAsAdmin)) {
       base::CommandLine new_cmd(base::CommandLine::NO_PROGRAM);
       new_cmd.AppendArguments(cmd_line, true);
diff --git a/chrome/installer/util/shell_util.cc b/chrome/installer/util/shell_util.cc
index dc51efd..bf8e226b 100644
--- a/chrome/installer/util/shell_util.cc
+++ b/chrome/installer/util/shell_util.cc
@@ -1098,33 +1098,6 @@
   return ShellUtil::IS_DEFAULT;
 }
 
-// Probe the current commands registered to handle the shell "open" verb for
-// |protocols| (Windows XP); see ProbeProtocolHandlers.
-ShellUtil::DefaultState ProbeOpenCommandHandlers(
-    const base::FilePath& chrome_exe,
-    const wchar_t* const* protocols,
-    size_t num_protocols) {
-  const HKEY root_key = HKEY_CLASSES_ROOT;
-  base::string16 key_path;
-  base::win::RegKey key;
-  base::string16 value;
-  InstallUtil::ProgramCompare chrome_compare(chrome_exe);
-  for (size_t i = 0; i < num_protocols; ++i) {
-    // Get the command line from HKCU\<protocol>\shell\open\command.
-    key_path.assign(protocols[i]).append(ShellUtil::kRegShellOpen);
-    if (key.Open(root_key, key_path.c_str(),
-                 KEY_QUERY_VALUE) != ERROR_SUCCESS ||
-        key.ReadValue(L"", &value) != ERROR_SUCCESS) {
-      return ShellUtil::NOT_DEFAULT;
-    }
-
-    if (!chrome_compare.Evaluate(value))
-      return ShellUtil::NOT_DEFAULT;
-  }
-
-  return ShellUtil::IS_DEFAULT;
-}
-
 // A helper function that probes default protocol handler registration (in a
 // manner appropriate for the current version of Windows) to determine if
 // Chrome is the default handler for |protocols|.  Returns IS_DEFAULT
@@ -1143,10 +1116,8 @@
 
   if (windows_version >= base::win::VERSION_WIN8)
     return ProbeCurrentDefaultHandlers(chrome_exe, protocols, num_protocols);
-  else if (windows_version >= base::win::VERSION_VISTA)
-    return ProbeAppIsDefaultHandlers(chrome_exe, protocols, num_protocols);
 
-  return ProbeOpenCommandHandlers(chrome_exe, protocols, num_protocols);
+  return ProbeAppIsDefaultHandlers(chrome_exe, protocols, num_protocols);
 }
 
 // (Windows 8+) Finds and stores an app shortcuts folder path in *|path|.
@@ -1876,34 +1847,30 @@
   // browser.
   base::string16 app_name = GetApplicationName(chrome_exe);
 
-  if (base::win::GetVersion() >= base::win::VERSION_VISTA) {
-    // On Windows Vista and Win7 we still can set ourselves via the
-    // the IApplicationAssociationRegistration interface.
-    VLOG(1) << "Registering Chrome as default browser on Vista.";
-    base::win::ScopedComPtr<IApplicationAssociationRegistration> pAAR;
-    HRESULT hr = ::CoCreateInstance(CLSID_ApplicationAssociationRegistration,
-                                    NULL, CLSCTX_INPROC, IID_PPV_ARGS(&pAAR));
-    if (SUCCEEDED(hr)) {
-      for (int i = 0; kBrowserProtocolAssociations[i] != NULL; i++) {
-        hr = pAAR->SetAppAsDefault(app_name.c_str(),
-            kBrowserProtocolAssociations[i], AT_URLPROTOCOL);
-        if (!SUCCEEDED(hr)) {
-          ret = false;
-          LOG(ERROR) << "Failed to register as default for protocol "
-                     << kBrowserProtocolAssociations[i]
-                     << " (" << hr << ")";
-        }
+  // On Windows 7 we still can set ourselves via the the
+  // IApplicationAssociationRegistration interface.
+  VLOG(1) << "Registering Chrome as default browser on Windows 7.";
+  base::win::ScopedComPtr<IApplicationAssociationRegistration> pAAR;
+  HRESULT hr = ::CoCreateInstance(CLSID_ApplicationAssociationRegistration,
+                                  NULL, CLSCTX_INPROC, IID_PPV_ARGS(&pAAR));
+  if (SUCCEEDED(hr)) {
+    for (int i = 0; kBrowserProtocolAssociations[i] != NULL; i++) {
+      hr = pAAR->SetAppAsDefault(
+          app_name.c_str(), kBrowserProtocolAssociations[i], AT_URLPROTOCOL);
+      if (!SUCCEEDED(hr)) {
+        ret = false;
+        LOG(ERROR) << "Failed to register as default for protocol "
+                   << kBrowserProtocolAssociations[i] << " (" << hr << ")";
       }
+    }
 
-      for (int i = 0; kDefaultFileAssociations[i] != NULL; i++) {
-        hr = pAAR->SetAppAsDefault(app_name.c_str(),
-            kDefaultFileAssociations[i], AT_FILEEXTENSION);
-        if (!SUCCEEDED(hr)) {
-          ret = false;
-          LOG(ERROR) << "Failed to register as default for file extension "
-                     << kDefaultFileAssociations[i]
-                     << " (" << hr << ")";
-        }
+    for (int i = 0; kDefaultFileAssociations[i] != NULL; i++) {
+      hr = pAAR->SetAppAsDefault(app_name.c_str(), kDefaultFileAssociations[i],
+                                 AT_FILEEXTENSION);
+      if (!SUCCEEDED(hr)) {
+        ret = false;
+        LOG(ERROR) << "Failed to register as default for file extension "
+                   << kDefaultFileAssociations[i] << " (" << hr << ")";
       }
     }
   }
@@ -1982,24 +1949,22 @@
     return false;
 
   bool ret = true;
-  // First use the new "recommended" way on Vista to make Chrome default
+  // First use the "recommended" way introduced in Vista to make Chrome default
   // protocol handler.
-  if (base::win::GetVersion() >= base::win::VERSION_VISTA) {
-    VLOG(1) << "Registering Chrome as default handler for " << protocol
-            << " on Vista.";
-    base::win::ScopedComPtr<IApplicationAssociationRegistration> pAAR;
-    HRESULT hr = ::CoCreateInstance(CLSID_ApplicationAssociationRegistration,
-                                    NULL, CLSCTX_INPROC, IID_PPV_ARGS(&pAAR));
-    if (SUCCEEDED(hr)) {
-      base::string16 app_name = GetApplicationName(chrome_exe);
-      hr = pAAR->SetAppAsDefault(app_name.c_str(), protocol.c_str(),
-                                 AT_URLPROTOCOL);
-    }
-    if (!SUCCEEDED(hr)) {
-      ret = false;
-      LOG(ERROR) << "Could not make Chrome default protocol client (Vista):"
-                 << " HRESULT=" << hr << ".";
-    }
+  VLOG(1) << "Registering Chrome as default handler for " << protocol
+          << " on Windows 7.";
+  base::win::ScopedComPtr<IApplicationAssociationRegistration> pAAR;
+  HRESULT hr = ::CoCreateInstance(CLSID_ApplicationAssociationRegistration,
+                                  NULL, CLSCTX_INPROC, IID_PPV_ARGS(&pAAR));
+  if (SUCCEEDED(hr)) {
+    base::string16 app_name = GetApplicationName(chrome_exe);
+    hr = pAAR->SetAppAsDefault(app_name.c_str(), protocol.c_str(),
+                               AT_URLPROTOCOL);
+  }
+  if (!SUCCEEDED(hr)) {
+    ret = false;
+    LOG(ERROR) << "Could not make Chrome default protocol client (Windows 7):"
+               << " HRESULT=" << hr << ".";
   }
 
   // Now use the old way to associate Chrome with the desired protocol. This
@@ -2189,8 +2154,7 @@
     std::vector<std::unique_ptr<RegistryEntry>> entries;
     GetProtocolCapabilityEntries(suffix, protocol, &entries);
     return AddRegistryEntries(root, entries);
-  } else if (elevate_if_not_admin &&
-             base::win::GetVersion() >= base::win::VERSION_VISTA) {
+  } else if (elevate_if_not_admin) {
     // Elevate to do the whole job
     return ElevateAndRegisterChrome(dist, chrome_exe, suffix, protocol);
   } else {
diff --git a/chrome/installer/zucchini/BUILD.gn b/chrome/installer/zucchini/BUILD.gn
index bf90f53..2445966 100644
--- a/chrome/installer/zucchini/BUILD.gn
+++ b/chrome/installer/zucchini/BUILD.gn
@@ -7,10 +7,6 @@
 
 static_library("zucchini_lib") {
   sources = [
-    "buffer_sink.cc",
-    "buffer_sink.h",
-    "buffer_source.cc",
-    "buffer_source.h",
     "buffer_view.h",
     "crc32.cc",
     "crc32.h",
@@ -33,7 +29,9 @@
     "zucchini_main.cc",
   ]
 
-  deps = []
+  deps = [
+    "//build/config:exe_and_shlib_deps",
+  ]
 
   if (is_win) {
     deps += [ ":zucchini_exe_version" ]
@@ -49,8 +47,6 @@
 
 test("zucchini_unittests") {
   sources = [
-    "buffer_sink_unittest.cc",
-    "buffer_source_unittest.cc",
     "buffer_view_unittest.cc",
     "crc32_unittest.cc",
     "io_utils_unittest.cc",
diff --git a/chrome/installer/zucchini/buffer_sink.cc b/chrome/installer/zucchini/buffer_sink.cc
deleted file mode 100644
index 9c09af85..0000000
--- a/chrome/installer/zucchini/buffer_sink.cc
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/installer/zucchini/buffer_sink.h"
-
-namespace zucchini {
-
-BufferSink::BufferSink(MutableBufferView buffer) : MutableBufferView(buffer) {}
-
-}  // namespace zucchini
diff --git a/chrome/installer/zucchini/buffer_sink.h b/chrome/installer/zucchini/buffer_sink.h
deleted file mode 100644
index 3e3be8e..0000000
--- a/chrome/installer/zucchini/buffer_sink.h
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_INSTALLER_ZUCCHINI_BUFFER_SINK_H_
-#define CHROME_INSTALLER_ZUCCHINI_BUFFER_SINK_H_
-
-#include <algorithm>
-#include <cstddef>
-#include <cstdint>
-#include <iterator>
-
-#include "base/logging.h"
-#include "chrome/installer/zucchini/buffer_view.h"
-
-namespace zucchini {
-
-// BufferSink acts like an output stream with convenience methods to serialize
-// data into a contiguous sequence of raw data. The underlying MutableBufferView
-// emulates a cursor to track current write position, and guards against buffer
-// overrun. Where applicable, BufferSink should be passed by pointer to maintain
-// cursor progress across writes.
-class BufferSink : public MutableBufferView {
- public:
-  using iterator = MutableBufferView::iterator;
-
-  using MutableBufferView::MutableBufferView;
-  BufferSink() = default;
-  explicit BufferSink(MutableBufferView buffer);
-  BufferSink(const BufferSink&) = default;
-
-  BufferSink& operator=(BufferSink&&) = default;
-
-  // If sufficient space is available, writes the binary representation of
-  // |value| starting at cursor, while advancing the cursor beyond the written
-  // region, and returns true. Otherwise returns false.
-  template <class T>
-  bool PutValue(const T& value) {
-    DCHECK_NE(begin(), nullptr);
-    if (Remaining() < sizeof(T))
-      return false;
-    *reinterpret_cast<T*>(begin()) = value;
-    remove_prefix(sizeof(T));
-    return true;
-  }
-
-  // If sufficient space is available, writes the raw bytes [|first|, |last|)
-  // starting at cursor, while advancing the cursor beyond the written region,
-  // and returns true. Otherwise returns false.
-  template <class It>
-  bool PutRange(It first, It last) {
-    static_assert(sizeof(typename std::iterator_traits<It>::value_type) ==
-                      sizeof(uint8_t),
-                  "value_type should fit in uint8_t");
-    DCHECK_NE(begin(), nullptr);
-    DCHECK(last >= first);
-    if (Remaining() < size_type(last - first))
-      return false;
-    std::copy(first, last, begin());
-    remove_prefix(last - first);
-    return true;
-  }
-
-  size_type Remaining() const { return size(); }
-};
-
-}  // namespace zucchini
-
-#endif  // CHROME_INSTALLER_ZUCCHINI_BUFFER_SINK_H_
diff --git a/chrome/installer/zucchini/buffer_sink_unittest.cc b/chrome/installer/zucchini/buffer_sink_unittest.cc
deleted file mode 100644
index c371cd72..0000000
--- a/chrome/installer/zucchini/buffer_sink_unittest.cc
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/installer/zucchini/buffer_sink.h"
-
-#include <vector>
-
-#include "base/test/gtest_util.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace zucchini {
-
-constexpr uint8_t kUninit = 0xFF;
-
-class BufferSinkTest : public testing::Test {
- protected:
-  void SetUp() override {
-    buffer_ = std::vector<uint8_t>(10, kUninit);
-    sink_ = BufferSink(buffer_.data(), buffer_.size());
-  }
-
-  std::vector<uint8_t> buffer_;
-  BufferSink sink_;
-};
-
-TEST_F(BufferSinkTest, PutValue) {
-  EXPECT_EQ(size_t(10), sink_.Remaining());
-
-  EXPECT_TRUE(sink_.PutValue(uint32_t(0x76543210)));
-  EXPECT_EQ(size_t(6), sink_.Remaining());
-
-  EXPECT_TRUE(sink_.PutValue(uint32_t(0xFEDCBA98)));
-  EXPECT_EQ(size_t(2), sink_.Remaining());
-
-  EXPECT_FALSE(sink_.PutValue(uint32_t(0x00)));
-  EXPECT_EQ(size_t(2), sink_.Remaining());
-
-  EXPECT_TRUE(sink_.PutValue(uint16_t(0x0010)));
-  EXPECT_EQ(size_t(0), sink_.Remaining());
-
-  // Assuming little-endian architecture.
-  EXPECT_EQ(std::vector<uint8_t>(
-                {0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, 0x10, 0x00}),
-            buffer_);
-}
-
-TEST_F(BufferSinkTest, PutRange) {
-  std::vector<uint8_t> range = {0x10, 0x32, 0x54, 0x76, 0x98, 0xBA,
-                                0xDC, 0xFE, 0x10, 0x00, 0x42};
-
-  EXPECT_EQ(size_t(10), sink_.Remaining());
-  EXPECT_FALSE(sink_.PutRange(range.begin(), range.end()));
-  EXPECT_EQ(size_t(10), sink_.Remaining());
-
-  EXPECT_TRUE(sink_.PutRange(range.begin(), range.begin() + 8));
-  EXPECT_EQ(size_t(2), sink_.Remaining());
-  EXPECT_EQ(std::vector<uint8_t>({0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC,
-                                  0xFE, kUninit, kUninit}),
-            buffer_);
-
-  EXPECT_FALSE(sink_.PutRange(range.begin(), range.begin() + 4));
-  EXPECT_EQ(size_t(2), sink_.Remaining());
-
-  // range is not written
-  EXPECT_EQ(std::vector<uint8_t>({0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC,
-                                  0xFE, kUninit, kUninit}),
-            buffer_);
-}
-
-}  // namespace zucchini
diff --git a/chrome/installer/zucchini/buffer_source.cc b/chrome/installer/zucchini/buffer_source.cc
deleted file mode 100644
index b688dc4c..0000000
--- a/chrome/installer/zucchini/buffer_source.cc
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/installer/zucchini/buffer_source.h"
-
-#include <algorithm>
-
-namespace zucchini {
-
-BufferSource::BufferSource(ConstBufferView buffer) : ConstBufferView(buffer) {}
-
-BufferSource& BufferSource::Skip(size_type n) {
-  remove_prefix(std::min(n, Remaining()));
-  return *this;
-}
-
-bool BufferSource::CheckNextBytes(std::initializer_list<uint8_t> bytes) const {
-  if (Remaining() < bytes.size())
-    return false;
-  return std::mismatch(bytes.begin(), bytes.end(), begin()).first ==
-         bytes.end();
-}
-
-bool BufferSource::ConsumeBytes(std::initializer_list<uint8_t> bytes) {
-  if (!CheckNextBytes(bytes))
-    return false;
-  remove_prefix(bytes.size());
-  return true;
-}
-
-bool BufferSource::GetRegion(size_type count, ConstBufferView* buffer) {
-  DCHECK_NE(begin(), nullptr);
-  if (Remaining() < count)
-    return false;
-  *buffer = ConstBufferView(begin(), count);
-  remove_prefix(count);
-  return true;
-}
-
-}  // namespace zucchini
diff --git a/chrome/installer/zucchini/buffer_source.h b/chrome/installer/zucchini/buffer_source.h
deleted file mode 100644
index 6dab416..0000000
--- a/chrome/installer/zucchini/buffer_source.h
+++ /dev/null
@@ -1,125 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_INSTALLER_ZUCCHINI_BUFFER_SOURCE_H_
-#define CHROME_INSTALLER_ZUCCHINI_BUFFER_SOURCE_H_
-
-#include <algorithm>
-#include <cstddef>
-#include <cstdint>
-#include <initializer_list>
-#include <type_traits>
-
-#include "chrome/installer/zucchini/buffer_view.h"
-
-namespace zucchini {
-
-// BufferSource acts like an input stream with convenience methods to parse data
-// from a contiguous sequence of raw data. The underlying ConstBufferView
-// emulates a cursor to track current read position, and guards against buffer
-// overrun. Where applicable, BufferSource should be passed by pointer to
-// maintain cursor progress across reads.
-class BufferSource : public ConstBufferView {
- public:
-  static BufferSource FromRange(const_iterator first, const_iterator last) {
-    return BufferSource(ConstBufferView::FromRange(first, last));
-  }
-
-  using ConstBufferView::ConstBufferView;
-  BufferSource() = default;
-  explicit BufferSource(ConstBufferView buffer);
-  BufferSource(const BufferSource&) = default;
-
-  BufferSource& operator=(BufferSource&&) = default;
-
-  // Moves cursor forward by |n| bytes, or until end if data is exhausted.
-  // Returns a reference to *this, to allow chaining, e.g.:
-  //   if (!buffer_source.Skip(1024).GetValue<uint32_t>(&value)) {
-  //      ... // Handle error.
-  //   }
-  // Notice that Skip() defers error handling to GetValue().
-  BufferSource& Skip(size_type n);
-
-  // Returns true if |value| matches data starting at cursor when reinterpreted
-  // as the integral type |T|.
-  template <class T>
-  bool CheckNextValue(const T& value) const {
-    static_assert(std::is_integral<T>::value,
-                  "Value type must be an integral type");
-
-    DCHECK_NE(begin(), nullptr);
-    if (Remaining() < sizeof(T))
-      return false;
-    return value == *reinterpret_cast<const T*>(begin());
-  }
-
-  // Returns true if the next bytes.size() bytes at the cursor match those in
-  // |bytes|.
-  bool CheckNextBytes(std::initializer_list<uint8_t> bytes) const;
-
-  // Same as CheckNextBytes(), but moves the cursor by bytes.size() if read is
-  // successfull.
-  bool ConsumeBytes(std::initializer_list<uint8_t> bytes);
-
-  // Tries to reinterpret data as type |T|, starting at cursor and to write the
-  // result into |value|, while moving the cursor forward by sizeof(T). Returns
-  // true if sufficient data is available, and false otherwise.
-  template <class T>
-  bool GetValue(T* value) {
-    static_assert(std::is_standard_layout<T>::value,
-                  "Value type must be a standard layout type");
-
-    DCHECK_NE(begin(), nullptr);
-    if (Remaining() < sizeof(T))
-      return false;
-    *value = *reinterpret_cast<const T*>(begin());
-    remove_prefix(sizeof(T));
-    return true;
-  }
-
-  // Tries to reinterpret data as type |T| at cursor and to return a
-  // reinterpreted pointer of type |T| pointing into the underlying data, while
-  // moving the cursor forward by sizeof(T). Returns nullptr if insufficient
-  // data is available.
-  template <class T>
-  const T* GetPointer() {
-    static_assert(std::is_standard_layout<T>::value,
-                  "Value type must be a standard layout type");
-
-    DCHECK_NE(begin(), nullptr);
-    if (Remaining() < sizeof(T))
-      return nullptr;
-    const T* ptr = reinterpret_cast<const T*>(begin());
-    remove_prefix(sizeof(T));
-    return ptr;
-  }
-
-  // Tries to reinterpret data as an array of type |T| with |count| elements,
-  // starting at cursor, and to return a reinterpreted pointer of type |T|
-  // pointing into the underlying data, while advancing the cursor beyond the
-  // array. Returns nullptr if insufficient data is available.
-  template <class T>
-  const T* GetArray(size_t count) {
-    static_assert(std::is_standard_layout<T>::value,
-                  "Value type must be a standard layout type");
-
-    if (Remaining() / sizeof(T) < count)
-      return nullptr;
-    const T* array = reinterpret_cast<const T*>(begin());
-    remove_prefix(count * sizeof(T));
-    return array;
-  }
-
-  // If sufficient data is available, assigns |buffer| to point to a region of
-  // |size| bytes starting at cursor, while advancing the cursor beyond the
-  // region, and returns true. Otherwise returns false.
-  bool GetRegion(size_type size, ConstBufferView* buffer);
-
-  // Returns the number of bytes remaining from cursor until end.
-  size_type Remaining() const { return size(); }
-};
-
-}  // namespace zucchini
-
-#endif  // CHROME_INSTALLER_ZUCCHINI_BUFFER_SOURCE_H_
diff --git a/chrome/installer/zucchini/buffer_source_unittest.cc b/chrome/installer/zucchini/buffer_source_unittest.cc
deleted file mode 100644
index edc04de5..0000000
--- a/chrome/installer/zucchini/buffer_source_unittest.cc
+++ /dev/null
@@ -1,170 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/installer/zucchini/buffer_source.h"
-
-#include <cstdint>
-#include <iterator>
-#include <vector>
-
-#include "base/test/gtest_util.h"
-
-namespace zucchini {
-
-using vec = std::vector<uint8_t>;
-
-static constexpr size_t kLen = 10;
-constexpr const uint8_t bytes[kLen] = {0x10, 0x32, 0x54, 0x76, 0x98,
-                                       0xBA, 0xDC, 0xFE, 0x10, 0x00};
-
-class BufferSourceTest : public testing::Test {
- protected:
-  BufferSource source_ = {std::begin(bytes), kLen};
-};
-
-TEST_F(BufferSourceTest, Skip) {
-  EXPECT_EQ(kLen, source_.Remaining());
-  source_.Skip(2);
-  EXPECT_EQ(kLen - 2, source_.Remaining());
-  source_.Skip(10);  // Skipping past end just moves cursor to end.
-  EXPECT_EQ(size_t(0), source_.Remaining());
-}
-
-TEST_F(BufferSourceTest, CheckNextBytes) {
-  EXPECT_TRUE(source_.CheckNextBytes({0x10, 0x32, 0x54, 0x76}));
-  source_.Skip(4);
-  EXPECT_TRUE(source_.CheckNextBytes({0x98, 0xBA, 0xDC, 0xFE}));
-
-  // Cursor has not advanced, so check fails.
-  EXPECT_FALSE(source_.CheckNextBytes({0x10, 0x00}));
-
-  source_.Skip(4);
-  EXPECT_EQ(size_t(2), source_.Remaining());
-
-  // Goes beyond end by 2 bytes.
-  EXPECT_FALSE(source_.CheckNextBytes({0x10, 0x00, 0x00, 0x00}));
-  EXPECT_EQ(size_t(2), source_.Remaining());
-}
-
-TEST_F(BufferSourceTest, ConsumeBytes) {
-  EXPECT_FALSE(source_.ConsumeBytes({0x10, 0x00}));
-  EXPECT_EQ(kLen, source_.Remaining());
-  EXPECT_TRUE(source_.ConsumeBytes({0x10, 0x32, 0x54, 0x76}));
-  EXPECT_EQ(size_t(6), source_.Remaining());
-  EXPECT_TRUE(source_.ConsumeBytes({0x98, 0xBA, 0xDC, 0xFE}));
-  EXPECT_EQ(size_t(2), source_.Remaining());
-
-  // Goes beyond end by 2 bytes.
-  EXPECT_FALSE(source_.ConsumeBytes({0x10, 0x00, 0x00, 0x00}));
-  EXPECT_EQ(size_t(2), source_.Remaining());
-}
-
-TEST_F(BufferSourceTest, CheckNextValue) {
-  EXPECT_TRUE(source_.CheckNextValue(uint32_t(0x76543210)));
-  EXPECT_FALSE(source_.CheckNextValue(uint32_t(0x0)));
-  EXPECT_TRUE(source_.CheckNextValue(uint64_t(0xFEDCBA9876543210)));
-  EXPECT_FALSE(source_.CheckNextValue(uint64_t(0x0)));
-
-  source_.Skip(8);
-  EXPECT_EQ(size_t(2), source_.Remaining());
-
-  // Goes beyond end by 2 bytes.
-  EXPECT_FALSE(source_.CheckNextValue(uint32_t(0x1000)));
-}
-
-// Supported by MSVC, g++, and clang++.
-// Ensures no gaps in packing.
-#pragma pack(push, 1)
-struct ValueType {
-  uint32_t a;
-  uint16_t b;
-};
-#pragma pack(pop)
-
-TEST_F(BufferSourceTest, GetValueIntegral) {
-  uint32_t value = 0;
-  EXPECT_TRUE(source_.GetValue(&value));
-  EXPECT_EQ(uint32_t(0x76543210), value);
-  EXPECT_EQ(size_t(6), source_.Remaining());
-
-  EXPECT_TRUE(source_.GetValue(&value));
-  EXPECT_EQ(uint32_t(0xFEDCBA98), value);
-  EXPECT_EQ(size_t(2), source_.Remaining());
-
-  EXPECT_FALSE(source_.GetValue(&value));
-  EXPECT_EQ(size_t(2), source_.Remaining());
-}
-
-TEST_F(BufferSourceTest, GetValueAggregate) {
-  ValueType value = {};
-  EXPECT_TRUE(source_.GetValue(&value));
-  EXPECT_EQ(uint32_t(0x76543210), value.a);
-  EXPECT_EQ(uint32_t(0xBA98), value.b);
-  EXPECT_EQ(size_t(4), source_.Remaining());
-}
-
-TEST_F(BufferSourceTest, GetRegion) {
-  ConstBufferView region;
-  EXPECT_TRUE(source_.GetRegion(0, &region));
-  EXPECT_EQ(kLen, source_.Remaining());
-  EXPECT_TRUE(region.empty());
-
-  EXPECT_TRUE(source_.GetRegion(2, &region));
-  EXPECT_EQ(size_t(2), region.size());
-  EXPECT_EQ(vec({0x10, 0x32}), vec(region.begin(), region.end()));
-  EXPECT_EQ(size_t(8), source_.Remaining());
-
-  EXPECT_FALSE(source_.GetRegion(kLen, &region));
-  EXPECT_EQ(size_t(8), source_.Remaining());
-  // |region| is left untouched.
-  EXPECT_EQ(vec({0x10, 0x32}), vec(region.begin(), region.end()));
-  EXPECT_EQ(size_t(2), region.size());
-}
-
-TEST_F(BufferSourceTest, GetPointerIntegral) {
-  const uint32_t* ptr = source_.GetPointer<uint32_t>();
-  EXPECT_NE(nullptr, ptr);
-  EXPECT_EQ(uint32_t(0x76543210), *ptr);
-  EXPECT_EQ(size_t(6), source_.Remaining());
-
-  ptr = source_.GetPointer<uint32_t>();
-  EXPECT_NE(nullptr, ptr);
-  EXPECT_EQ(uint32_t(0xFEDCBA98), *ptr);
-  EXPECT_EQ(size_t(2), source_.Remaining());
-
-  EXPECT_EQ(nullptr, source_.GetPointer<uint32_t>());
-  EXPECT_EQ(size_t(2), source_.Remaining());
-}
-
-TEST_F(BufferSourceTest, GetPointerAggregate) {
-  const ValueType* ptr = source_.GetPointer<ValueType>();
-  EXPECT_NE(nullptr, ptr);
-  EXPECT_EQ(uint32_t(0x76543210), ptr->a);
-  EXPECT_EQ(uint32_t(0xBA98), ptr->b);
-  EXPECT_EQ(size_t(4), source_.Remaining());
-}
-
-TEST_F(BufferSourceTest, GetArrayIntegral) {
-  EXPECT_EQ(nullptr, source_.GetArray<uint32_t>(3));
-
-  const uint32_t* ptr = source_.GetArray<uint32_t>(2);
-  EXPECT_NE(nullptr, ptr);
-  EXPECT_EQ(uint32_t(0x76543210), ptr[0]);
-  EXPECT_EQ(uint32_t(0xFEDCBA98), ptr[1]);
-  EXPECT_EQ(size_t(2), source_.Remaining());
-}
-
-TEST_F(BufferSourceTest, GetArrayAggregate) {
-  const ValueType* ptr = source_.GetArray<ValueType>(2);
-  EXPECT_EQ(nullptr, ptr);
-
-  ptr = source_.GetArray<ValueType>(1);
-
-  EXPECT_NE(nullptr, ptr);
-  EXPECT_EQ(uint32_t(0x76543210), ptr[0].a);
-  EXPECT_EQ(uint32_t(0xBA98), ptr[0].b);
-  EXPECT_EQ(size_t(4), source_.Remaining());
-}
-
-}  // namespace zucchini
diff --git a/chrome/installer/zucchini/buffer_view.h b/chrome/installer/zucchini/buffer_view.h
index 8ac43ed6..cf13fc48 100644
--- a/chrome/installer/zucchini/buffer_view.h
+++ b/chrome/installer/zucchini/buffer_view.h
@@ -28,7 +28,7 @@
   using difference_type = std::ptrdiff_t;
 
   static BufferViewBase FromRange(iterator first, iterator last) {
-    DCHECK_GE(last, first);
+    DCHECK(last >= first);
     BufferViewBase ret;
     ret.first_ = first;
     ret.last_ = last;
@@ -39,7 +39,7 @@
 
   BufferViewBase(iterator first, size_type size)
       : first_(first), last_(first_ + size) {
-    DCHECK_GE(last_, first_);
+    DCHECK(last_ >= first_);
   }
 
   BufferViewBase(const BufferViewBase&) = default;
@@ -57,7 +57,7 @@
   // Returns the raw value at specified location |pos|.
   // If |pos| is not within the range of the buffer, the process is terminated.
   reference operator[](size_type pos) const {
-    CHECK_LT(first_ + pos, last_);
+    CHECK(first_ + pos < last_);
     return first_[pos];
   }
 
@@ -69,16 +69,10 @@
   // Modifiers
 
   void shrink(size_type new_size) {
-    DCHECK_LE(first_ + new_size, last_);
+    DCHECK(first_ + new_size <= last_);
     last_ = first_ + new_size;
   }
 
-  // Moves the start of the view forward by n bytes.
-  void remove_prefix(size_type n) {
-    DCHECK_LE(n, size());
-    first_ += n;
-  }
-
  private:
   iterator first_ = nullptr;
   iterator last_ = nullptr;
diff --git a/chrome/profiling/memlog_connection_manager.cc b/chrome/profiling/memlog_connection_manager.cc
index b305b9b..3407e4d8 100644
--- a/chrome/profiling/memlog_connection_manager.cc
+++ b/chrome/profiling/memlog_connection_manager.cc
@@ -40,7 +40,7 @@
 MemlogConnectionManager::~MemlogConnectionManager() {
   // Clear the callback since the server is refcounted and may outlive us.
   server_->set_on_new_connection(
-      base::RepeatingCallback<void(scoped_refptr<MemlogReceiverPipe>)>());
+      MemlogReceiverPipeServer::NewConnectionCallback());
 }
 
 void MemlogConnectionManager::StartConnections(const std::string& pipe_id) {
@@ -57,27 +57,31 @@
       base::Bind(
           &ProfilingProcess::EnsureMojoStarted,
           base::Unretained(ProfilingGlobals::Get()->GetProfilingProcess())));
+  ProfilingGlobals::Get()->GetIORunner()->PostTask(
+      FROM_HERE, base::Bind(&ProfilingProcess::AttachPipeServer,
+                            base::Unretained(
+                                ProfilingGlobals::Get()->GetProfilingProcess()),
+                            server_));
 }
 
 void MemlogConnectionManager::OnNewConnection(
-    scoped_refptr<MemlogReceiverPipe> new_pipe) {
-  int remote_process = new_pipe->GetRemoteProcessID();
-
+    scoped_refptr<MemlogReceiverPipe> new_pipe,
+    int sender_pid) {
   // Task to post to clean up the connection. Don't need to retain |this| since
   // it wil be called by objects owned by the MemlogConnectionManager.
-  AllocationTracker::CompleteCallback complete_cb = base::BindOnce(
-      &MemlogConnectionManager::OnConnectionCompleteThunk,
-      base::Unretained(this), base::MessageLoop::current()->task_runner(),
-      remote_process);
+  AllocationTracker::CompleteCallback complete_cb =
+      base::BindOnce(&MemlogConnectionManager::OnConnectionCompleteThunk,
+                     base::Unretained(this),
+                     base::MessageLoop::current()->task_runner(), sender_pid);
 
   std::unique_ptr<Connection> connection = base::MakeUnique<Connection>(
-      std::move(complete_cb), remote_process, new_pipe);
+      std::move(complete_cb), sender_pid, new_pipe);
   connection->thread.Start();
 
   connection->parser = new MemlogStreamParser(this, &connection->tracker);
   new_pipe->SetReceiver(connection->thread.task_runner(), connection->parser);
 
-  connections_[remote_process] = std::move(connection);
+  connections_[sender_pid] = std::move(connection);
 }
 
 void MemlogConnectionManager::OnConnectionComplete(int process_id) {
diff --git a/chrome/profiling/memlog_connection_manager.h b/chrome/profiling/memlog_connection_manager.h
index 6ad9f209..ef9b686 100644
--- a/chrome/profiling/memlog_connection_manager.h
+++ b/chrome/profiling/memlog_connection_manager.h
@@ -37,7 +37,8 @@
   void OnStartMojoControl() override;
 
   // Called by the pipe server when a new pipe is created.
-  void OnNewConnection(scoped_refptr<MemlogReceiverPipe> new_pipe);
+  void OnNewConnection(scoped_refptr<MemlogReceiverPipe> new_pipe,
+                       int sender_pid);
 
   // Notification that a connection is complete. Unlike OnNewConnection which
   // is signaled by the pipe server, this is signaled by the allocation tracker
diff --git a/chrome/profiling/memlog_receiver_pipe_posix.cc b/chrome/profiling/memlog_receiver_pipe_posix.cc
index 38e7d60..b861f5b6 100644
--- a/chrome/profiling/memlog_receiver_pipe_posix.cc
+++ b/chrome/profiling/memlog_receiver_pipe_posix.cc
@@ -25,7 +25,9 @@
 }  // namespace
 
 MemlogReceiverPipe::MemlogReceiverPipe(base::ScopedFD fd)
-    : fd_(std::move(fd)), read_buffer_(new char[kReadBufferSize]) {
+    : fd_(std::move(fd)),
+      controller_(FROM_HERE),
+      read_buffer_(new char[kReadBufferSize]) {
   static std::vector<base::ScopedFD> dummy_instance;
   dummy_for_receive_ = &dummy_instance;
 }
@@ -47,6 +49,8 @@
     } else if (bytes_read == 0) {
       // Other end closed the pipe.
       if (receiver_) {
+        controller_.StopWatchingFileDescriptor();
+        DCHECK(receiver_task_runner_);
         receiver_task_runner_->PostTask(
             FROM_HERE,
             base::BindOnce(&MemlogStreamReceiver::OnStreamComplete, receiver_));
@@ -54,16 +58,13 @@
       return;
     } else {
       if (errno != EAGAIN && errno != EWOULDBLOCK) {
+        controller_.StopWatchingFileDescriptor();
         PLOG(ERROR) << "Problem reading socket.";
       }
     }
   } while (bytes_read > 0);
 }
 
-int MemlogReceiverPipe::GetRemoteProcessID() {
-  return 1;  // TODO(ajwong): Record the originating process ID somehow.
-}
-
 void MemlogReceiverPipe::SetReceiver(
     scoped_refptr<base::TaskRunner> task_runner,
     scoped_refptr<MemlogStreamReceiver> receiver) {
diff --git a/chrome/profiling/memlog_receiver_pipe_posix.h b/chrome/profiling/memlog_receiver_pipe_posix.h
index b9a2209a..a4cf23b 100644
--- a/chrome/profiling/memlog_receiver_pipe_posix.h
+++ b/chrome/profiling/memlog_receiver_pipe_posix.h
@@ -28,15 +28,21 @@
 
   void ReadUntilBlocking();
 
-  int GetRemoteProcessID();
   void SetReceiver(scoped_refptr<base::TaskRunner> task_runner,
                    scoped_refptr<MemlogStreamReceiver> receiver);
 
+  // TODO(ajwong): Remove when file watching is moved from the PipeServer to
+  // the MemlogReceiverPipe.
+  base::MessageLoopForIO::FileDescriptorWatcher* controller() {
+    return &controller_;
+  }
+
  private:
   friend class base::RefCountedThreadSafe<MemlogReceiverPipe>;
   ~MemlogReceiverPipe();
 
   base::ScopedFD fd_;
+  base::MessageLoopForIO::FileDescriptorWatcher controller_;
   std::unique_ptr<char[]> read_buffer_;
 
   scoped_refptr<base::TaskRunner> receiver_task_runner_;
diff --git a/chrome/profiling/memlog_receiver_pipe_server_posix.cc b/chrome/profiling/memlog_receiver_pipe_server_posix.cc
index e94e37a..0c381a6 100644
--- a/chrome/profiling/memlog_receiver_pipe_server_posix.cc
+++ b/chrome/profiling/memlog_receiver_pipe_server_posix.cc
@@ -25,20 +25,24 @@
 MemlogReceiverPipeServer::~MemlogReceiverPipeServer() {}
 
 void MemlogReceiverPipeServer::Start() {
-  // Create Mojo Message Pipe here.
-  io_runner_->PostTask(FROM_HERE,
-                       base::Bind(&MemlogReceiverPipeServer::StartOnIO, this));
-  // TODO(ajwong): Add mojo service here.
+  // TODO(ajwong): This uses 0 as the sender_pid.  Decide if we want to use
+  // read PIDs, or just the browser concept of a child_process_id for an
+  // identifier.
+  io_runner_->PostTask(
+      FROM_HERE, base::BindOnce(&MemlogReceiverPipeServer::OnNewPipe, this,
+                                std::move(first_pipe_), 0));
 }
 
-void MemlogReceiverPipeServer::StartOnIO() {
-  scoped_refptr<MemlogReceiverPipe> pipe(
-      pipe_poller_.CreatePipe(std::move(first_pipe_)));
-  on_new_connection_.Run(pipe);
-  pipe->ReadUntilBlocking();
+void MemlogReceiverPipeServer::OnNewPipe(base::ScopedFD pipe, int sender_pid) {
+  DCHECK(io_runner_->RunsTasksInCurrentSequence());
+
+  scoped_refptr<MemlogReceiverPipe> receiver_pipe(
+      pipe_poller_.CreatePipe(std::move(pipe)));
+  on_new_connection_.Run(receiver_pipe, sender_pid);
+  receiver_pipe->ReadUntilBlocking();
 }
 
-MemlogReceiverPipeServer::PipePoller::PipePoller() : controller_(FROM_HERE) {}
+MemlogReceiverPipeServer::PipePoller::PipePoller() {}
 
 MemlogReceiverPipeServer::PipePoller::~PipePoller() {}
 
@@ -48,7 +52,8 @@
   scoped_refptr<MemlogReceiverPipe> pipe(new MemlogReceiverPipe(std::move(fd)));
   pipes_[raw_fd] = pipe;
   base::MessageLoopForIO::current()->WatchFileDescriptor(
-      raw_fd, true, base::MessageLoopForIO::WATCH_READ, &controller_, this);
+      raw_fd, true, base::MessageLoopForIO::WATCH_READ, pipe->controller(),
+      this);
   return pipe;
 }
 
diff --git a/chrome/profiling/memlog_receiver_pipe_server_posix.h b/chrome/profiling/memlog_receiver_pipe_server_posix.h
index 2c7a316..a12c297a 100644
--- a/chrome/profiling/memlog_receiver_pipe_server_posix.h
+++ b/chrome/profiling/memlog_receiver_pipe_server_posix.h
@@ -29,7 +29,7 @@
     : public base::RefCountedThreadSafe<MemlogReceiverPipeServer> {
  public:
   using NewConnectionCallback =
-      base::RepeatingCallback<void(scoped_refptr<MemlogReceiverPipe>)>;
+      base::RepeatingCallback<void(scoped_refptr<MemlogReceiverPipe>, int)>;
 
   // |io_runner| is the task runner for the I/O thread. When a new connection is
   // established, the |on_new_conn| callback is called with the pipe.
@@ -44,12 +44,20 @@
   // Starts the server which opens the pipe and begins accepting connections.
   void Start();
 
+  // Runs on IO Thread.
+  // TODO(ajwong): Make private once the correct separation of responsibilities
+  // is worked out between MemlogReceiverPipeServer and ProfilingProcess.
+  void OnNewPipe(base::ScopedFD pipe, int sender_pid);
+
  private:
   friend class base::RefCountedThreadSafe<MemlogReceiverPipeServer>;
   ~MemlogReceiverPipeServer();
 
-  void StartOnIO();
-
+  // TODO(ajwong): Remove this class.  Initially it was created under the
+  // mistaken understanding that one FileDescriptorWatcher could watch
+  // multiple file descriptors. That's incorrect meaning each
+  // MemlogReceiverPipe can own its own watcher and polling logic which
+  // makes this class useless.
   class PipePoller : public base::MessageLoopForIO::Watcher {
    public:
     PipePoller();
@@ -61,8 +69,6 @@
     void OnFileCanWriteWithoutBlocking(int fd) override;
 
    private:
-    base::MessageLoopForIO::FileDescriptorWatcher controller_;
-
     base::flat_map<int, scoped_refptr<MemlogReceiverPipe>> pipes_;
   };
 
diff --git a/chrome/profiling/profiling_process.cc b/chrome/profiling/profiling_process.cc
index f9f81fd0..fa8accdc8 100644
--- a/chrome/profiling/profiling_process.cc
+++ b/chrome/profiling/profiling_process.cc
@@ -5,8 +5,10 @@
 #include "chrome/profiling/profiling_process.h"
 
 #include "base/bind.h"
+#include "base/files/scoped_platform_handle.h"
 #include "chrome/common/profiling/profiling_constants.h"
 #include "chrome/profiling/profiling_globals.h"
+#include "mojo/public/cpp/system/platform_handle.h"
 
 namespace profiling {
 
@@ -27,7 +29,18 @@
       control_invitation_->ExtractMessagePipe(kProfilingControlPipeName)));
 }
 
+void ProfilingProcess::AttachPipeServer(
+    scoped_refptr<MemlogReceiverPipeServer> server) {
+  server_ = server;
+}
+
 void ProfilingProcess::AddNewSender(mojo::ScopedHandle sender_pipe,
-                                    int32_t sender_pid) {}
+                                    int32_t sender_pid) {
+  base::PlatformFile sender_file;
+  MojoResult result =
+      mojo::UnwrapPlatformFile(std::move(sender_pipe), &sender_file);
+  CHECK_EQ(result, MOJO_RESULT_OK);
+  server_->OnNewPipe(base::ScopedFD(sender_file), sender_pid);
+}
 
 }  // namespace profiling
diff --git a/chrome/profiling/profiling_process.h b/chrome/profiling/profiling_process.h
index 5030203..695a55ac 100644
--- a/chrome/profiling/profiling_process.h
+++ b/chrome/profiling/profiling_process.h
@@ -12,6 +12,8 @@
 
 namespace profiling {
 
+class MemlogReceiverPipeServer;
+
 // Represents the profiling process side of the profiling <-> browser
 // connection. This class is not thread safe and must onle be called on the IO
 // thread (which is the main thread in the profiling process).
@@ -21,6 +23,7 @@
   ~ProfilingProcess() override;
 
   void EnsureMojoStarted();
+  void AttachPipeServer(scoped_refptr<MemlogReceiverPipeServer> server);
 
   // ProfilingControl implementation.
   void AddNewSender(mojo::ScopedHandle sender_pipe,
@@ -32,6 +35,7 @@
   std::unique_ptr<mojo::edk::IncomingBrokerClientInvitation>
       control_invitation_;
 
+  scoped_refptr<MemlogReceiverPipeServer> server_;
   mojo::Binding<mojom::ProfilingControl> binding_;
 
   DISALLOW_COPY_AND_ASSIGN(ProfilingProcess);
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index c85eb805..4c638ebc0 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -1355,6 +1355,7 @@
       "../browser/net/predictor_browsertest.cc",
       "../browser/net/proxy_browsertest.cc",
       "../browser/net/sdch_browsertest.cc",
+      "../browser/net/system_network_context_manager_browsertest.cc",
       "../browser/net/websocket_browsertest.cc",
       "../browser/ntp_snippets/content_suggestions_service_factory_browsertest.cc",
       "../browser/ntp_tiles/ntp_tiles_browsertest.cc",
@@ -2274,6 +2275,7 @@
         "../browser/chromeos/login/webview_login_browsertest.cc",
         "../browser/chromeos/login/wizard_controller_browsertest.cc",
         "../browser/chromeos/net/network_portal_detector_impl_browsertest.cc",
+        "../browser/chromeos/options/network_config_view_browsertest.cc",
         "../browser/chromeos/policy/affiliation_test_helper.cc",
         "../browser/chromeos/policy/affiliation_test_helper.h",
         "../browser/chromeos/policy/blocking_login_browsertest.cc",
@@ -3061,13 +3063,13 @@
     "../browser/component_updater/supervised_user_whitelist_installer_unittest.cc",
     "../browser/component_updater/sw_reporter_installer_win_unittest.cc",
     "../browser/conflicts/enumerate_input_method_editors_win_unittest.cc",
+    "../browser/conflicts/enumerate_shell_extensions_win_unittest.cc",
     "../browser/conflicts/installed_programs_win_unittest.cc",
     "../browser/conflicts/module_database_win_unittest.cc",
     "../browser/conflicts/module_event_sink_impl_win_unittest.cc",
     "../browser/conflicts/module_info_util_win_unittest.cc",
     "../browser/conflicts/module_info_win_unittest.cc",
     "../browser/conflicts/module_inspector_win_unittest.cc",
-    "../browser/conflicts/shell_extension_enumerator_win_unittest.cc",
     "../browser/content_settings/content_settings_default_provider_unittest.cc",
     "../browser/content_settings/content_settings_mock_observer.cc",
     "../browser/content_settings/content_settings_mock_observer.h",
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeInstrumentationTestRunner.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeInstrumentationTestRunner.java
index 26ca0cb6..f8873f4 100644
--- a/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeInstrumentationTestRunner.java
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeInstrumentationTestRunner.java
@@ -11,6 +11,7 @@
 import com.google.android.gms.common.ConnectionResult;
 import com.google.android.gms.common.GoogleApiAvailability;
 
+import org.chromium.base.CommandLine;
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.test.BaseChromiumInstrumentationTestRunner;
 import org.chromium.base.test.BaseTestResult;
@@ -108,6 +109,13 @@
             }
         }
 
+        private boolean isDonEnabled() {
+            // We can't directly check whether the VR DON flow is enabled since
+            // we don't have permission to read the VrCore settings file. Instead,
+            // pass a flag.
+            return CommandLine.getInstance().hasSwitch("don-enabled");
+        }
+
         @Override
         protected boolean restrictionApplies(String restriction) {
             if (TextUtils.equals(restriction, ChromeRestriction.RESTRICTION_TYPE_PHONE)
@@ -158,6 +166,9 @@
                     return true;
                 }
             }
+            if (TextUtils.equals(restriction, ChromeRestriction.RESTRICTION_TYPE_DON_ENABLED)) {
+                return !isDonEnabled();
+            }
             return false;
         }
     }
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/ChromeRestriction.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/ChromeRestriction.java
index 01b9352..48e3454 100644
--- a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/ChromeRestriction.java
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/ChromeRestriction.java
@@ -25,4 +25,6 @@
     public static final String RESTRICTION_TYPE_VIEWER_DAYDREAM = "Daydream_View";
     /** Specifies the test is only valid if the current VR viewer is not Daydream View */
     public static final String RESTRICTION_TYPE_VIEWER_NON_DAYDREAM = "Non_Daydream_View";
+    /** Specifies the test is only valid if the DON flow is not skipped */
+    public static final String RESTRICTION_TYPE_DON_ENABLED = "DON_Enabled";
 }
diff --git a/chrome/test/data/android/webvr_instrumentation/html/test_presentation_promise_unresolved_during_don.html b/chrome/test/data/android/webvr_instrumentation/html/test_presentation_promise_unresolved_during_don.html
new file mode 100644
index 0000000..5e1fab6
--- /dev/null
+++ b/chrome/test/data/android/webvr_instrumentation/html/test_presentation_promise_unresolved_during_don.html
@@ -0,0 +1,32 @@
+<!doctype html>
+<!--
+Used to test that the promise returned by WebVR's requestPresent does not get
+resolved or rejected while the DON flow is active.
+-->
+<html>
+  <head>
+    <link rel="stylesheet" type="text/css" href="../resources/webvr_e2e.css">
+  </head>
+  <body>
+    <canvas id="webgl-canvas"></canvas>
+    <script src="../../../../../../third_party/WebKit/LayoutTests/resources/testharness.js"></script>
+    <script src="../resources/webvr_e2e.js"></script>
+    <script src="../resources/webvr_boilerplate.js"></script>
+    <script>
+      var t = async_test("Presentation promise is unresolved during DON flow");
+      function onVrRequestPresentWithDon() {
+        vrDisplay.requestPresent([{source: webglCanvas}]).then( () => {
+          t.step( () => {
+            assert_unreached("requestPresent promise resolved");
+          });
+        }, () => {
+          t.step( () => {
+            assert_unreached("requestPresent promise rejected");
+          });
+        });
+        window.setTimeout( () => {t.done();}, 1000);
+      }
+      webglCanvas.onclick = onVrRequestPresentWithDon;
+    </script>
+  </body>
+</html>
diff --git a/chrome/test/data/extensions/api_test/tab_capture/max_offscreen_tabs.js b/chrome/test/data/extensions/api_test/tab_capture/max_offscreen_tabs.js
index 49c9068..576162d 100644
--- a/chrome/test/data/extensions/api_test/tab_capture/max_offscreen_tabs.js
+++ b/chrome/test/data/extensions/api_test/tab_capture/max_offscreen_tabs.js
@@ -20,8 +20,8 @@
          helloWorldPageUri,
          {video: true},
          function(stream) {
-           if (streamsSoFar.length == 3) {
-             // 4th off-screen tab capture should fail.
+           if (streamsSoFar.length == 4) {
+             // 5th off-screen tab capture should fail.
              chrome.test.assertLastError(
                  'Extension has already started too many off-screen tabs.');
              chrome.test.assertFalse(!!stream);
diff --git a/chrome/test/data/extensions/api_test/tab_capture/offscreen_evil_tests.js b/chrome/test/data/extensions/api_test/tab_capture/offscreen_evil_tests.js
index f3f822f..d2655e0 100644
--- a/chrome/test/data/extensions/api_test/tab_capture/offscreen_evil_tests.js
+++ b/chrome/test/data/extensions/api_test/tab_capture/offscreen_evil_tests.js
@@ -19,6 +19,18 @@
   );
 }
 
+function waitForTabToCloseAndEndTest(stream) {
+  let check = () => {
+    if (!stream.getTracks().find(track => track.readyState != 'ended')) {
+      chrome.test.succeed();
+    }
+  };
+  check();
+  stream.getTracks().forEach(track => {
+    track.onended = check;
+  });
+}
+
 chrome.test.runTests([
   function cannotAccessLocalResources() {
     chrome.tabCapture.captureOffscreenTab(
@@ -77,9 +89,27 @@
       waitForGreenOrRedTestResultAndEndTest);
   },
 
+  function cannotNavigateWhenPresenting() {
+    const captureOptions = getCaptureOptions();
+    captureOptions.presentationId = 'presentation_id';
+    chrome.tabCapture.captureOffscreenTab(
+      makeDataUriFromDocument(
+        '<html><script>' +
+        'window.location = "http://example.com/some_url.html";' +
+        '</script></html>'),
+      captureOptions,
+      waitForTabToCloseAndEndTest);
+    // NOTE: If this test times out, it means that one of the following did not
+    // happen:
+    // 1. page loaded
+    // 2. tab capture began
+    // 3. page attempted to navigate
+    // 4. page was closed by offscreen_tab.cc
+    // 5. MediaStreamTracks were ended
+  },
+
   // NOTE: Before adding any more tests, the maximum off-screen tab limit would
   // have to be increased (or a design issue resolved).  This is because
   // off-screen tabs are not closed the instant the LocalMediaStream is stopped,
   // but approximately 1 second later.
-
 ]);
diff --git a/chrome/utility/importer/ie_importer_win.cc b/chrome/utility/importer/ie_importer_win.cc
index e91834d..1c8c057 100644
--- a/chrome/utility/importer/ie_importer_win.cc
+++ b/chrome/utility/importer/ie_importer_win.cc
@@ -31,7 +31,6 @@
 #include "base/win/scoped_comptr.h"
 #include "base/win/scoped_handle.h"
 #include "base/win/scoped_propvariant.h"
-#include "base/win/windows_version.h"
 #include "chrome/common/importer/edge_importer_utils_win.h"
 #include "chrome/common/importer/ie_importer_utils_win.h"
 #include "chrome/common/importer/imported_bookmark_entry.h"
@@ -53,8 +52,6 @@
   L"Software\\Microsoft\\Internet Explorer\\SearchScopes";
 const base::char16 kIEVersionKey[] =
   L"Software\\Microsoft\\Internet Explorer";
-const base::char16 kIEToolbarKey[] =
-  L"Software\\Microsoft\\Internet Explorer\\Toolbar";
 
 // NTFS stream name of favicon image data.
 const base::char16 kFaviconStreamName[] = L":favicon:$DATA";
@@ -801,27 +798,18 @@
 
   // IE stores the favorites in the Favorites under user profile's folder.
   wchar_t buffer[MAX_PATH];
-  if (FAILED(SHGetFolderPath(NULL, CSIDL_FAVORITES, NULL,
-                             SHGFP_TYPE_CURRENT, buffer)))
+  if (FAILED(SHGetFolderPath(NULL, CSIDL_FAVORITES, NULL, SHGFP_TYPE_CURRENT,
+                             buffer))) {
     return false;
-  info->path = base::FilePath(buffer);
-
-  // There is a Links folder under Favorites folder in Windows Vista, but it
-  // is not recording in Vista's registry. So in Vista, we assume the Links
-  // folder is under Favorites folder since it looks like there is not name
-  // different in every language version of Windows Vista.
-  if (base::win::GetVersion() < base::win::VERSION_VISTA) {
-    // The Link folder name is stored in the registry.
-    DWORD buffer_length = sizeof(buffer);
-    base::win::RegKey reg_key(HKEY_CURRENT_USER, kIEToolbarKey, KEY_READ);
-    if (reg_key.ReadValue(L"LinksFolderName", buffer,
-                          &buffer_length, NULL) != ERROR_SUCCESS)
-      return false;
-    info->links_folder = buffer;
-  } else {
-    info->links_folder = L"Links";
   }
 
+  // There is a Links folder under Favorites folder since Windows Vista, but it
+  // is not recording in Vista's registry. So we assume the Links folder is
+  // under Favorites folder since it looks like there is not name different in
+  // every language version of Windows.
+  info->path = base::FilePath(buffer);
+  info->links_folder = L"Links";
+
   return true;
 }
 
diff --git a/chrome/utility/safe_browsing/mac/crdmg.cc b/chrome/utility/safe_browsing/mac/crdmg.cc
index edae4f4..9242bce 100644
--- a/chrome/utility/safe_browsing/mac/crdmg.cc
+++ b/chrome/utility/safe_browsing/mac/crdmg.cc
@@ -17,6 +17,7 @@
 
 #include "base/files/file.h"
 #include "base/logging.h"
+#include "base/mac/availability.h"
 #include "base/macros.h"
 #include "base/posix/eintr_wrapper.h"
 #include "base/strings/stringprintf.h"
@@ -53,7 +54,7 @@
   bool EnableSandbox();
 
   // Performs the actual DMG operation.
-  __attribute__((availability(macos, introduced = 10.10))) bool ParseDMG();
+  API_AVAILABLE(macos(10.10)) bool ParseDMG();
 
   base::File dmg_file_;
 
diff --git a/chromeos/components/tether/ble_advertiser.cc b/chromeos/components/tether/ble_advertiser.cc
index beb1555..b182441 100644
--- a/chromeos/components/tether/ble_advertiser.cc
+++ b/chromeos/components/tether/ble_advertiser.cc
@@ -20,8 +20,64 @@
 
 uint8_t kInvertedConnectionFlag = 0x01;
 
+// Handles the unregistration of a BluetoothAdvertisement in the case that its
+// intended owner (an IndividualAdvertisement) was destroyed before successful
+// registration. See
+// BleAdvertiser::IndividualAdvertisement::OnAdvertisementRegistered().
+void OnAdvertisementUnregisteredAfterOwnerDestruction(
+    const std::string& associated_device_id) {
+  PA_LOG(ERROR) << "Unregistered advertisement for device ID: "
+                << cryptauth::RemoteDevice::TruncateDeviceIdForLogs(
+                       associated_device_id);
+}
+
+// Handles the failed unregistration of a BluetoothAdvertisement in the case
+// that its intended owner (an IndividualAdvertisement) was destroyed before
+// successful registration. See
+// BleAdvertiser::IndividualAdvertisement::OnAdvertisementRegistered().
+//
+// It is not expected that this function ever be called; that would indicate an
+// error in Bluetooth.
+void OnAdvertisementUnregisteredAfterOwnerDestructionFailure(
+    const std::string& associated_device_id,
+    device::BluetoothAdvertisement::ErrorCode error_code) {
+  PA_LOG(ERROR) << "Error unregistering advertisement. "
+                << "Device ID: \""
+                << cryptauth::RemoteDevice::TruncateDeviceIdForLogs(
+                       associated_device_id)
+                << "\", Error code: " << error_code;
+}
+
 }  // namespace
 
+// TODO (hansberry): Remove this workaround once crbug.com/741050 has been
+// resolved.
+// static
+void BleAdvertiser::IndividualAdvertisement::OnAdvertisementRegistered(
+    base::WeakPtr<BleAdvertiser::IndividualAdvertisement>
+        individual_advertisement,
+    const std::string& associated_device_id,
+    scoped_refptr<device::BluetoothAdvertisement> advertisement) {
+  // It's possible that the IndividualAdvertisement that registered this
+  // BluetoothAdvertisement has been destroyed before being able to own the
+  // BluetoothAdvertisement. If the IndividualAdvertisement still exists, simply
+  // give it the BluetoothAdvertisement it registered. If not, unregister the
+  // BluetoothAdvertisement, because otherwise it will remain registered
+  // forever.
+  if (individual_advertisement.get()) {
+    individual_advertisement->OnAdvertisementRegisteredCallback(advertisement);
+  } else {
+    PA_LOG(WARNING) << "BluetoothAdvertisement registered, but the "
+                    << "IndividualAdvertisement which registered it no longer "
+                    << "exists. Unregistering the BluetoothAdvertisement.";
+    advertisement->Unregister(
+        base::Bind(&OnAdvertisementUnregisteredAfterOwnerDestruction,
+                   associated_device_id),
+        base::Bind(&OnAdvertisementUnregisteredAfterOwnerDestructionFailure,
+                   associated_device_id));
+  }
+}
+
 BleAdvertiser::IndividualAdvertisement::IndividualAdvertisement(
     const std::string& device_id,
     scoped_refptr<device::BluetoothAdapter> adapter,
@@ -103,8 +159,8 @@
 
   adapter_->RegisterAdvertisement(
       std::move(advertisement_data),
-      base::Bind(&IndividualAdvertisement::OnAdvertisementRegisteredCallback,
-                 weak_ptr_factory_.GetWeakPtr()),
+      base::Bind(&OnAdvertisementRegistered, weak_ptr_factory_.GetWeakPtr(),
+                 device_id_),
       base::Bind(&IndividualAdvertisement::OnAdvertisementErrorCallback,
                  weak_ptr_factory_.GetWeakPtr()));
 }
diff --git a/chromeos/components/tether/ble_advertiser.h b/chromeos/components/tether/ble_advertiser.h
index a1211b2..b0025776 100644
--- a/chromeos/components/tether/ble_advertiser.h
+++ b/chromeos/components/tether/ble_advertiser.h
@@ -61,6 +61,12 @@
       : public device::BluetoothAdapter::Observer,
         public device::BluetoothAdvertisement::Observer {
    public:
+    static void OnAdvertisementRegistered(
+        base::WeakPtr<BleAdvertiser::IndividualAdvertisement>
+            individual_advertisement,
+        const std::string& associated_device_id,
+        scoped_refptr<device::BluetoothAdvertisement> advertisement);
+
     IndividualAdvertisement(
         const std::string& device_id,
         scoped_refptr<device::BluetoothAdapter> adapter,
diff --git a/chromeos/components/tether/ble_advertiser_unittest.cc b/chromeos/components/tether/ble_advertiser_unittest.cc
index 2b2ff64c..49659491 100644
--- a/chromeos/components/tether/ble_advertiser_unittest.cc
+++ b/chromeos/components/tether/ble_advertiser_unittest.cc
@@ -572,6 +572,35 @@
                            individual_advertisements_[0]);
 }
 
+TEST_F(BleAdvertiserTest,
+       AdvertisementRegisteredAfterIndividualAdvertisementWasDestroyed) {
+  EXPECT_CALL(*mock_adapter_, AddObserver(_)).Times(1);
+  EXPECT_CALL(*mock_adapter_, RemoveObserver(_)).Times(1);
+  EXPECT_CALL(*mock_adapter_, IsPowered()).Times(1);
+  EXPECT_CALL(*mock_adapter_, RegisterAdvertisementWithArgsStruct(_)).Times(1);
+
+  mock_eid_generator_->set_advertisement(
+      base::MakeUnique<cryptauth::DataWithTimestamp>(fake_advertisements_[0]));
+
+  EXPECT_TRUE(ble_advertiser_->StartAdvertisingToDevice(fake_devices_[0]));
+  EXPECT_EQ(1u, individual_advertisements_.size());
+  EXPECT_EQ(1u, register_advertisement_args_.size());
+  VerifyServiceDataMatches(register_advertisement_args_[0],
+                           individual_advertisements_[0]);
+
+  EXPECT_TRUE(ble_advertiser_->StopAdvertisingToDevice(fake_devices_[0]));
+  EXPECT_TRUE(individual_advertisements_.empty());
+
+  // Finish advertisement registration, without the IndividualAdvertisement
+  // which registered it existing.
+  InvokeCallback(register_advertisement_args_[0]);
+
+  // Verify that some mechanism recognized that the advertisement is not owned
+  // by any IndividualAdvertisement, and unregistered it. This verification will
+  // crash if Unregister() was not called on the advertisement.
+  InvokeLastUnregisterCallbackAndRemove();
+}
+
 }  // namespace tether
 
 }  // namespace chromeos
diff --git a/components/discardable_memory/client/client_discardable_shared_memory_manager.cc b/components/discardable_memory/client/client_discardable_shared_memory_manager.cc
index cd768d0..1ba13df 100644
--- a/components/discardable_memory/client/client_discardable_shared_memory_manager.cc
+++ b/components/discardable_memory/client/client_discardable_shared_memory_manager.cc
@@ -34,7 +34,7 @@
 const size_t kAllocationSize = 4 * 1024 * 1024;
 
 // Global atomic to generate unique discardable shared memory IDs.
-base::StaticAtomicSequenceNumber g_next_discardable_shared_memory_id;
+base::AtomicSequenceNumber g_next_discardable_shared_memory_id;
 
 class DiscardableMemoryImpl : public base::DiscardableMemory {
  public:
diff --git a/components/discardable_memory/service/discardable_shared_memory_manager.cc b/components/discardable_memory/service/discardable_shared_memory_manager.cc
index 0913399d..70d6dc55 100644
--- a/components/discardable_memory/service/discardable_shared_memory_manager.cc
+++ b/components/discardable_memory/service/discardable_shared_memory_manager.cc
@@ -209,7 +209,7 @@
 const int kEnforceMemoryPolicyDelayMs = 1000;
 
 // Global atomic to generate unique discardable shared memory IDs.
-base::StaticAtomicSequenceNumber g_next_discardable_shared_memory_id;
+base::AtomicSequenceNumber g_next_discardable_shared_memory_id;
 
 }  // namespace
 
diff --git a/components/exo/BUILD.gn b/components/exo/BUILD.gn
index 30bb6f99..4a4fc560 100644
--- a/components/exo/BUILD.gn
+++ b/components/exo/BUILD.gn
@@ -140,6 +140,7 @@
     "//cc:test_support",
     "//cc/surfaces:surfaces",
     "//components/user_manager",
+    "//components/viz/service",
     "//device/gamepad:test_helpers",
     "//gpu/command_buffer/client:gles2_interface",
     "//skia",
diff --git a/components/exo/DEPS b/components/exo/DEPS
index c58c382..1c40ca1 100644
--- a/components/exo/DEPS
+++ b/components/exo/DEPS
@@ -3,6 +3,7 @@
   "+cc",
   "+chromeos/audio/chromeos_sounds.h",
   "+components/viz/common/quads",
+  "+components/viz/service",
   "+device/gamepad",
   "+gpu",
   "+mojo/public/cpp",
diff --git a/components/exo/surface_unittest.cc b/components/exo/surface_unittest.cc
index 1752d623..d638abc 100644
--- a/components/exo/surface_unittest.cc
+++ b/components/exo/surface_unittest.cc
@@ -6,13 +6,13 @@
 #include "base/bind.h"
 #include "cc/output/compositor_frame.h"
 #include "cc/quads/texture_draw_quad.h"
-#include "cc/surfaces/frame_sink_manager.h"
 #include "cc/test/begin_frame_args_test.h"
 #include "cc/test/fake_external_begin_frame_source.h"
 #include "components/exo/buffer.h"
 #include "components/exo/surface.h"
 #include "components/exo/test/exo_test_base.h"
 #include "components/exo/test/exo_test_helper.h"
+#include "components/viz/service/frame_sinks/frame_sink_manager.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/aura/env.h"
 #include "ui/compositor/layer_tree_owner.h"
diff --git a/components/exo/wayland/server_unittest.cc b/components/exo/wayland/server_unittest.cc
index 9ab4277..77152fb 100644
--- a/components/exo/wayland/server_unittest.cc
+++ b/components/exo/wayland/server_unittest.cc
@@ -23,7 +23,7 @@
 namespace wayland {
 namespace {
 
-base::StaticAtomicSequenceNumber g_next_socket_id;
+base::AtomicSequenceNumber g_next_socket_id;
 
 std::string GetUniqueSocketName() {
   return base::StringPrintf("wayland-test-%d-%d", base::GetCurrentProcId(),
diff --git a/components/handoff/handoff_manager.h b/components/handoff/handoff_manager.h
index 9293ccf..f5ab5a2 100644
--- a/components/handoff/handoff_manager.h
+++ b/components/handoff/handoff_manager.h
@@ -7,6 +7,7 @@
 
 #import <Foundation/Foundation.h>
 
+#include "base/mac/availability.h"
 #include "build/build_config.h"
 #include "components/handoff/handoff_utility.h"
 #include "url/gurl.h"
@@ -31,8 +32,7 @@
 // The active URL is defined as the URL of the most recently accessed tab. This
 // method should be called any time the active URL might have changed. This
 // method is idempotent.
-- (void)updateActiveURL:(const GURL&)url
-    __attribute__((availability(macos, introduced = 10.10)));
+- (void)updateActiveURL:(const GURL&)url API_AVAILABLE(macos(10.10));
 
 @end
 
diff --git a/components/handoff/handoff_manager.mm b/components/handoff/handoff_manager.mm
index 366a80d..18dd9d9 100644
--- a/components/handoff/handoff_manager.mm
+++ b/components/handoff/handoff_manager.mm
@@ -23,23 +23,21 @@
 @interface HandoffManager ()
 
 // The active user activity.
-@property(nonatomic, retain) NSUserActivity* userActivity
-    __attribute__((availability(macos, introduced=10.10)));
+@property(nonatomic, retain)
+    NSUserActivity* userActivity API_AVAILABLE(macos(10.10));
 
 // Whether the URL of the current tab should be exposed for Handoff.
 - (BOOL)shouldUseActiveURL;
 
 // Updates the active NSUserActivity.
-- (void)updateUserActivity
-    __attribute__((availability(macos, introduced = 10.10)));
+- (void)updateUserActivity API_AVAILABLE(macos(10.10));
 
 @end
 
 @implementation HandoffManager {
   base::mac::ObjCPropertyReleaser _propertyReleaser_HandoffManager;
   GURL _activeURL;
-  NSUserActivity* _userActivity
-      __attribute__((availability(macos, introduced = 10.10)));
+  NSUserActivity* _userActivity API_AVAILABLE(macos(10.10));
   handoff::Origin _origin;
 }
 
diff --git a/components/payments_strings.grdp b/components/payments_strings.grdp
index 716de10..f5b9555 100644
--- a/components/payments_strings.grdp
+++ b/components/payments_strings.grdp
@@ -387,4 +387,7 @@
   <message name="IDS_PAYMENTS_PROFILE_LABELS_ACCESSIBLE_FORMAT" desc="The format to build the screen reader string for profile labels">
     <ph name="FIRST_LABEL">$1<ex>VISA ****1234</ex></ph> <ph name="SECOND_LABEL">$2<ex>Homer Simpson</ex></ph> <ph name="THIRD_LABEL">$3<ex>123 Fake Street</ex></ph>
   </message>
+  <message name="IDS_PAYMENTS_ACCESSIBLE_LABEL_WITH_ERROR" desc="The format to append an error message to a screen reader string describing a profile or payment method">
+    <ph name="LABEL">$1<ex>Homer Simpson 123 Fake Street</ex></ph> <ph name="ERROR">$2<ex>Phone number required</ex></ph>
+  </message>
 </grit-part>
diff --git a/components/proximity_auth/screenlock_bridge.cc b/components/proximity_auth/screenlock_bridge.cc
index f0cc8c4..45c11bf 100644
--- a/components/proximity_auth/screenlock_bridge.cc
+++ b/components/proximity_auth/screenlock_bridge.cc
@@ -152,7 +152,6 @@
 void ScreenlockBridge::SetFocusedUser(const AccountId& account_id) {
   if (account_id == focused_account_id_)
     return;
-  PA_LOG(INFO) << "Focused user changed to " << account_id.Serialize();
   focused_account_id_ = account_id;
   for (auto& observer : observers_)
     observer.OnFocusedUserChanged(account_id);
diff --git a/components/ukm/ukm_interface.cc b/components/ukm/ukm_interface.cc
index de60163..ce6a8013 100644
--- a/components/ukm/ukm_interface.cc
+++ b/components/ukm/ukm_interface.cc
@@ -35,7 +35,7 @@
 void UkmInterface::Create(UkmRecorder* ukm_recorder,
                           const service_manager::BindSourceInfo& source_info,
                           mojom::UkmRecorderInterfaceRequest request) {
-  static base::StaticAtomicSequenceNumber seq;
+  static base::AtomicSequenceNumber seq;
   mojo::MakeStrongBinding(
       base::MakeUnique<UkmInterface>(ukm_recorder,
                                      static_cast<int64_t>(seq.GetNext()) + 1),
diff --git a/components/viz/service/BUILD.gn b/components/viz/service/BUILD.gn
index 40cd8fc..5d8e588 100644
--- a/components/viz/service/BUILD.gn
+++ b/components/viz/service/BUILD.gn
@@ -40,6 +40,9 @@
     "frame_sinks/frame_eviction_manager.h",
     "frame_sinks/frame_evictor.cc",
     "frame_sinks/frame_evictor.h",
+    "frame_sinks/frame_sink_manager.cc",
+    "frame_sinks/frame_sink_manager.h",
+    "frame_sinks/frame_sink_manager_client.h",
     "frame_sinks/frame_sink_manager_impl.cc",
     "frame_sinks/frame_sink_manager_impl.h",
     "frame_sinks/gpu_compositor_frame_sink.cc",
@@ -122,6 +125,7 @@
     "display_embedder/server_shared_bitmap_manager_unittest.cc",
     "frame_sinks/compositor_frame_sink_support_unittest.cc",
     "frame_sinks/direct_layer_tree_frame_sink_unittest.cc",
+    "frame_sinks/frame_sink_manager_unittest.cc",
   ]
 
   if (!use_aura && !is_mac) {
diff --git a/components/viz/service/display/display_unittest.cc b/components/viz/service/display/display_unittest.cc
index ebbaed0..b980608 100644
--- a/components/viz/service/display/display_unittest.cc
+++ b/components/viz/service/display/display_unittest.cc
@@ -13,7 +13,6 @@
 #include "cc/output/texture_mailbox_deleter.h"
 #include "cc/quads/render_pass.h"
 #include "cc/scheduler/begin_frame_source.h"
-#include "cc/surfaces/frame_sink_manager.h"
 #include "cc/surfaces/surface.h"
 #include "cc/surfaces/surface_manager.h"
 #include "cc/test/compositor_frame_helpers.h"
@@ -26,6 +25,7 @@
 #include "components/viz/service/display/display_client.h"
 #include "components/viz/service/display/display_scheduler.h"
 #include "components/viz/service/frame_sinks/compositor_frame_sink_support.h"
+#include "components/viz/service/frame_sinks/frame_sink_manager.h"
 #include "gpu/GLES2/gl2extchromium.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -154,7 +154,7 @@
     support_->SubmitCompositorFrame(local_surface_id, std::move(frame));
   }
 
-  cc::FrameSinkManager manager_;
+  FrameSinkManager manager_;
   std::unique_ptr<CompositorFrameSinkSupport> support_;
   LocalSurfaceIdAllocator id_allocator_;
   scoped_refptr<base::NullTaskRunner> task_runner_;
diff --git a/components/viz/service/display/surface_aggregator_perftest.cc b/components/viz/service/display/surface_aggregator_perftest.cc
index 2979a7a..96dede9 100644
--- a/components/viz/service/display/surface_aggregator_perftest.cc
+++ b/components/viz/service/display/surface_aggregator_perftest.cc
@@ -7,7 +7,6 @@
 #include "cc/output/compositor_frame.h"
 #include "cc/quads/surface_draw_quad.h"
 #include "cc/quads/texture_draw_quad.h"
-#include "cc/surfaces/frame_sink_manager.h"
 #include "cc/surfaces/surface_manager.h"
 #include "cc/test/compositor_frame_helpers.h"
 #include "cc/test/fake_output_surface_client.h"
@@ -16,6 +15,7 @@
 #include "cc/test/test_shared_bitmap_manager.h"
 #include "components/viz/service/display/surface_aggregator.h"
 #include "components/viz/service/frame_sinks/compositor_frame_sink_support.h"
+#include "components/viz/service/frame_sinks/frame_sink_manager.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "testing/perf/perf_test.h"
 
@@ -147,7 +147,7 @@
   }
 
  protected:
-  cc::FrameSinkManager manager_;
+  FrameSinkManager manager_;
   scoped_refptr<cc::TestContextProvider> context_provider_;
   std::unique_ptr<SharedBitmapManager> shared_bitmap_manager_;
   std::unique_ptr<cc::ResourceProvider> resource_provider_;
diff --git a/components/viz/service/display/surface_aggregator_pixeltest.cc b/components/viz/service/display/surface_aggregator_pixeltest.cc
index 2dbf3ab..0c9df7f0 100644
--- a/components/viz/service/display/surface_aggregator_pixeltest.cc
+++ b/components/viz/service/display/surface_aggregator_pixeltest.cc
@@ -7,7 +7,6 @@
 #include "cc/quads/render_pass.h"
 #include "cc/quads/solid_color_draw_quad.h"
 #include "cc/quads/surface_draw_quad.h"
-#include "cc/surfaces/frame_sink_manager.h"
 #include "cc/surfaces/surface.h"
 #include "cc/surfaces/surface_manager.h"
 #include "cc/test/compositor_frame_helpers.h"
@@ -16,6 +15,7 @@
 #include "components/viz/common/surfaces/local_surface_id_allocator.h"
 #include "components/viz/service/display/surface_aggregator.h"
 #include "components/viz/service/frame_sinks/compositor_frame_sink_support.h"
+#include "components/viz/service/frame_sinks/frame_sink_manager.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 #if !defined(OS_ANDROID)
@@ -46,7 +46,7 @@
   ~SurfaceAggregatorPixelTest() override { support_->EvictCurrentSurface(); }
 
  protected:
-  cc::FrameSinkManager manager_;
+  FrameSinkManager manager_;
   LocalSurfaceIdAllocator allocator_;
   std::unique_ptr<CompositorFrameSinkSupport> support_;
 };
diff --git a/components/viz/service/display/surface_aggregator_unittest.cc b/components/viz/service/display/surface_aggregator_unittest.cc
index 73659557..9c144612 100644
--- a/components/viz/service/display/surface_aggregator_unittest.cc
+++ b/components/viz/service/display/surface_aggregator_unittest.cc
@@ -19,7 +19,6 @@
 #include "cc/quads/solid_color_draw_quad.h"
 #include "cc/quads/surface_draw_quad.h"
 #include "cc/quads/texture_draw_quad.h"
-#include "cc/surfaces/frame_sink_manager.h"
 #include "cc/surfaces/surface.h"
 #include "cc/surfaces/surface_manager.h"
 #include "cc/test/compositor_frame_helpers.h"
@@ -31,6 +30,7 @@
 #include "components/viz/common/resources/shared_bitmap_manager.h"
 #include "components/viz/common/surfaces/local_surface_id_allocator.h"
 #include "components/viz/service/frame_sinks/compositor_frame_sink_support.h"
+#include "components/viz/service/frame_sinks/frame_sink_manager.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/skia/include/core/SkColor.h"
@@ -270,7 +270,7 @@
   }
 
  protected:
-  cc::FrameSinkManager manager_;
+  FrameSinkManager manager_;
   cc::FakeSurfaceObserver observer_;
   cc::FakeCompositorFrameSinkSupportClient fake_client_;
   std::unique_ptr<CompositorFrameSinkSupport> support_;
@@ -2091,7 +2091,7 @@
   }
 
  protected:
-  cc::FrameSinkManager manager_;
+  FrameSinkManager manager_;
   std::unique_ptr<SharedBitmapManager> shared_bitmap_manager_;
   std::unique_ptr<cc::ResourceProvider> resource_provider_;
   std::unique_ptr<SurfaceAggregator> aggregator_;
diff --git a/components/viz/service/frame_sinks/compositor_frame_sink_support.cc b/components/viz/service/frame_sinks/compositor_frame_sink_support.cc
index e9587255..70ee3f77 100644
--- a/components/viz/service/frame_sinks/compositor_frame_sink_support.cc
+++ b/components/viz/service/frame_sinks/compositor_frame_sink_support.cc
@@ -9,19 +9,19 @@
 
 #include "cc/output/compositor_frame.h"
 #include "cc/scheduler/begin_frame_source.h"
-#include "cc/surfaces/frame_sink_manager.h"
 #include "cc/surfaces/surface.h"
 #include "cc/surfaces/surface_reference.h"
 #include "components/viz/common/surfaces/surface_info.h"
 #include "components/viz/service/display/display.h"
 #include "components/viz/service/frame_sinks/compositor_frame_sink_support_client.h"
+#include "components/viz/service/frame_sinks/frame_sink_manager.h"
 
 namespace viz {
 
 // static
 std::unique_ptr<CompositorFrameSinkSupport> CompositorFrameSinkSupport::Create(
     CompositorFrameSinkSupportClient* client,
-    cc::FrameSinkManager* frame_sink_manager,
+    FrameSinkManager* frame_sink_manager,
     const FrameSinkId& frame_sink_id,
     bool is_root,
     bool handles_frame_sink_id_invalidation,
@@ -306,8 +306,7 @@
       handles_frame_sink_id_invalidation_(handles_frame_sink_id_invalidation),
       weak_factory_(this) {}
 
-void CompositorFrameSinkSupport::Init(
-    cc::FrameSinkManager* frame_sink_manager) {
+void CompositorFrameSinkSupport::Init(FrameSinkManager* frame_sink_manager) {
   frame_sink_manager_ = frame_sink_manager;
   surface_manager_ = frame_sink_manager->surface_manager();
   if (handles_frame_sink_id_invalidation_)
diff --git a/components/viz/service/frame_sinks/compositor_frame_sink_support.h b/components/viz/service/frame_sinks/compositor_frame_sink_support.h
index 0d7dbf978..7c467c92 100644
--- a/components/viz/service/frame_sinks/compositor_frame_sink_support.h
+++ b/components/viz/service/frame_sinks/compositor_frame_sink_support.h
@@ -13,32 +13,33 @@
 #include "base/memory/weak_ptr.h"
 #include "cc/output/compositor_frame.h"
 #include "cc/scheduler/begin_frame_source.h"
-#include "cc/surfaces/frame_sink_manager_client.h"
 #include "cc/surfaces/referenced_surface_tracker.h"
 #include "cc/surfaces/surface_client.h"
 #include "cc/surfaces/surface_resource_holder.h"
 #include "cc/surfaces/surface_resource_holder_client.h"
 #include "components/viz/common/surfaces/surface_info.h"
+#include "components/viz/service/frame_sinks/frame_sink_manager_client.h"
 #include "components/viz/service/viz_service_export.h"
 
 namespace cc {
-class FrameSinkManager;
 class Surface;
 class SurfaceManager;
 }  // namespace cc
 
 namespace viz {
+
+class FrameSinkManager;
 class CompositorFrameSinkSupportClient;
 
 class VIZ_SERVICE_EXPORT CompositorFrameSinkSupport
     : public cc::BeginFrameObserver,
       public cc::SurfaceResourceHolderClient,
-      public cc::FrameSinkManagerClient,
+      public FrameSinkManagerClient,
       public cc::SurfaceClient {
  public:
   static std::unique_ptr<CompositorFrameSinkSupport> Create(
       CompositorFrameSinkSupportClient* client,
-      cc::FrameSinkManager* frame_sink_manager,
+      FrameSinkManager* frame_sink_manager,
       const FrameSinkId& frame_sink_id,
       bool is_root,
       bool handles_frame_sink_id_invalidation,
@@ -48,7 +49,7 @@
 
   const FrameSinkId& frame_sink_id() const { return frame_sink_id_; }
 
-  cc::FrameSinkManager* frame_sink_manager() { return frame_sink_manager_; }
+  FrameSinkManager* frame_sink_manager() { return frame_sink_manager_; }
   cc::SurfaceManager* surface_manager() { return surface_manager_; }
 
   // SurfaceClient implementation.
@@ -82,7 +83,7 @@
                              bool handles_frame_sink_id_invalidation,
                              bool needs_sync_tokens);
 
-  void Init(cc::FrameSinkManager* frame_sink_manager);
+  void Init(FrameSinkManager* frame_sink_manager);
 
  private:
   // Updates surface references using |active_referenced_surfaces| from the most
@@ -110,7 +111,7 @@
 
   CompositorFrameSinkSupportClient* const client_;
 
-  cc::FrameSinkManager* frame_sink_manager_ = nullptr;
+  FrameSinkManager* frame_sink_manager_ = nullptr;
   cc::SurfaceManager* surface_manager_ = nullptr;
 
   const FrameSinkId frame_sink_id_;
diff --git a/components/viz/service/frame_sinks/compositor_frame_sink_support_unittest.cc b/components/viz/service/frame_sinks/compositor_frame_sink_support_unittest.cc
index 5a39a83..6019d3c 100644
--- a/components/viz/service/frame_sinks/compositor_frame_sink_support_unittest.cc
+++ b/components/viz/service/frame_sinks/compositor_frame_sink_support_unittest.cc
@@ -9,7 +9,6 @@
 #include "cc/output/copy_output_request.h"
 #include "cc/output/copy_output_result.h"
 #include "cc/resources/resource_provider.h"
-#include "cc/surfaces/frame_sink_manager.h"
 #include "cc/test/begin_frame_args_test.h"
 #include "cc/test/compositor_frame_helpers.h"
 #include "cc/test/fake_external_begin_frame_source.h"
@@ -19,6 +18,7 @@
 #include "components/viz/common/surfaces/surface_id.h"
 #include "components/viz/common/surfaces/surface_info.h"
 #include "components/viz/service/frame_sinks/compositor_frame_sink_support_client.h"
+#include "components/viz/service/frame_sinks/frame_sink_manager.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -170,7 +170,7 @@
   }
 
  protected:
-  cc::FrameSinkManager manager_;
+  FrameSinkManager manager_;
   FakeCompositorFrameSinkSupportClient fake_support_client_;
   std::unique_ptr<CompositorFrameSinkSupport> support_;
   cc::FakeExternalBeginFrameSource begin_frame_source_;
diff --git a/components/viz/service/frame_sinks/direct_layer_tree_frame_sink.cc b/components/viz/service/frame_sinks/direct_layer_tree_frame_sink.cc
index e6083a3..8d5c797 100644
--- a/components/viz/service/frame_sinks/direct_layer_tree_frame_sink.cc
+++ b/components/viz/service/frame_sinks/direct_layer_tree_frame_sink.cc
@@ -7,17 +7,17 @@
 #include "base/bind.h"
 #include "cc/output/compositor_frame.h"
 #include "cc/output/layer_tree_frame_sink_client.h"
-#include "cc/surfaces/frame_sink_manager.h"
 #include "cc/surfaces/surface.h"
 #include "components/viz/common/surfaces/frame_sink_id.h"
 #include "components/viz/common/surfaces/local_surface_id_allocator.h"
 #include "components/viz/service/display/display.h"
+#include "components/viz/service/frame_sinks/frame_sink_manager.h"
 
 namespace viz {
 
 DirectLayerTreeFrameSink::DirectLayerTreeFrameSink(
     const FrameSinkId& frame_sink_id,
-    cc::FrameSinkManager* frame_sink_manager,
+    FrameSinkManager* frame_sink_manager,
     Display* display,
     scoped_refptr<cc::ContextProvider> context_provider,
     scoped_refptr<cc::ContextProvider> worker_context_provider,
@@ -39,7 +39,7 @@
 
 DirectLayerTreeFrameSink::DirectLayerTreeFrameSink(
     const FrameSinkId& frame_sink_id,
-    cc::FrameSinkManager* frame_sink_manager,
+    FrameSinkManager* frame_sink_manager,
     Display* display,
     scoped_refptr<cc::VulkanContextProvider> vulkan_context_provider)
     : LayerTreeFrameSink(std::move(vulkan_context_provider)),
diff --git a/components/viz/service/frame_sinks/direct_layer_tree_frame_sink.h b/components/viz/service/frame_sinks/direct_layer_tree_frame_sink.h
index 38d0b0c..ab38247 100644
--- a/components/viz/service/frame_sinks/direct_layer_tree_frame_sink.h
+++ b/components/viz/service/frame_sinks/direct_layer_tree_frame_sink.h
@@ -35,7 +35,7 @@
   // outlive this class.
   DirectLayerTreeFrameSink(
       const FrameSinkId& frame_sink_id,
-      cc::FrameSinkManager* frame_sink_manager,
+      FrameSinkManager* frame_sink_manager,
       Display* display,
       scoped_refptr<cc::ContextProvider> context_provider,
       scoped_refptr<cc::ContextProvider> worker_context_provider,
@@ -43,7 +43,7 @@
       SharedBitmapManager* shared_bitmap_manager);
   DirectLayerTreeFrameSink(
       const FrameSinkId& frame_sink_id,
-      cc::FrameSinkManager* frame_sink_manager,
+      FrameSinkManager* frame_sink_manager,
       Display* display,
       scoped_refptr<cc::VulkanContextProvider> vulkan_context_provider);
   ~DirectLayerTreeFrameSink() override;
@@ -81,7 +81,7 @@
 
   const FrameSinkId frame_sink_id_;
   LocalSurfaceId local_surface_id_;
-  cc::FrameSinkManager* frame_sink_manager_;
+  FrameSinkManager* frame_sink_manager_;
   LocalSurfaceIdAllocator local_surface_id_allocator_;
   Display* display_;
   gfx::Size last_swap_frame_size_;
diff --git a/components/viz/service/frame_sinks/direct_layer_tree_frame_sink_unittest.cc b/components/viz/service/frame_sinks/direct_layer_tree_frame_sink_unittest.cc
index c6dfe1f5..6d96600 100644
--- a/components/viz/service/frame_sinks/direct_layer_tree_frame_sink_unittest.cc
+++ b/components/viz/service/frame_sinks/direct_layer_tree_frame_sink_unittest.cc
@@ -11,7 +11,6 @@
 #include "cc/output/texture_mailbox_deleter.h"
 #include "cc/scheduler/begin_frame_source.h"
 #include "cc/scheduler/delay_based_time_source.h"
-#include "cc/surfaces/frame_sink_manager.h"
 #include "cc/test/begin_frame_args_test.h"
 #include "cc/test/compositor_frame_helpers.h"
 #include "cc/test/fake_layer_tree_frame_sink_client.h"
@@ -24,6 +23,7 @@
 #include "components/viz/common/surfaces/local_surface_id_allocator.h"
 #include "components/viz/service/display/display.h"
 #include "components/viz/service/display/display_scheduler.h"
+#include "components/viz/service/frame_sinks/frame_sink_manager.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace viz {
@@ -106,7 +106,7 @@
 
   const gfx::Size display_size_;
   const gfx::Rect display_rect_;
-  cc::FrameSinkManager frame_sink_manager_;
+  FrameSinkManager frame_sink_manager_;
   cc::TestSharedBitmapManager bitmap_manager_;
   cc::TestGpuMemoryBufferManager gpu_memory_buffer_manager_;
 
diff --git a/cc/surfaces/frame_sink_manager.cc b/components/viz/service/frame_sinks/frame_sink_manager.cc
similarity index 78%
rename from cc/surfaces/frame_sink_manager.cc
rename to components/viz/service/frame_sinks/frame_sink_manager.cc
index b101ecd..1959893 100644
--- a/cc/surfaces/frame_sink_manager.cc
+++ b/components/viz/service/frame_sinks/frame_sink_manager.cc
@@ -2,20 +2,20 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "cc/surfaces/frame_sink_manager.h"
+#include "components/viz/service/frame_sinks/frame_sink_manager.h"
 
 #include <stddef.h>
 #include <stdint.h>
 
 #include "base/logging.h"
-#include "cc/surfaces/frame_sink_manager_client.h"
 #include "cc/surfaces/primary_begin_frame_source.h"
+#include "components/viz/service/frame_sinks/frame_sink_manager_client.h"
 
 #if DCHECK_IS_ON()
 #include <sstream>
 #endif
 
-namespace cc {
+namespace viz {
 
 FrameSinkManager::FrameSinkSourceMapping::FrameSinkSourceMapping() = default;
 
@@ -24,7 +24,8 @@
 
 FrameSinkManager::FrameSinkSourceMapping::~FrameSinkSourceMapping() = default;
 
-FrameSinkManager::FrameSinkManager(SurfaceManager::LifetimeType lifetime_type)
+FrameSinkManager::FrameSinkManager(
+    cc::SurfaceManager::LifetimeType lifetime_type)
     : surface_manager_(lifetime_type) {}
 
 FrameSinkManager::~FrameSinkManager() {
@@ -33,18 +34,16 @@
   DCHECK_EQ(registered_sources_.size(), 0u);
 }
 
-void FrameSinkManager::RegisterFrameSinkId(
-    const viz::FrameSinkId& frame_sink_id) {
+void FrameSinkManager::RegisterFrameSinkId(const FrameSinkId& frame_sink_id) {
   surface_manager_.RegisterFrameSinkId(frame_sink_id);
 }
 
-void FrameSinkManager::InvalidateFrameSinkId(
-    const viz::FrameSinkId& frame_sink_id) {
+void FrameSinkManager::InvalidateFrameSinkId(const FrameSinkId& frame_sink_id) {
   surface_manager_.InvalidateFrameSinkId(frame_sink_id);
 }
 
 void FrameSinkManager::RegisterFrameSinkManagerClient(
-    const viz::FrameSinkId& frame_sink_id,
+    const FrameSinkId& frame_sink_id,
     FrameSinkManagerClient* client) {
   DCHECK(client);
   DCHECK_EQ(surface_manager_.GetValidFrameSinkIds().count(frame_sink_id), 1u);
@@ -59,7 +58,7 @@
 }
 
 void FrameSinkManager::UnregisterFrameSinkManagerClient(
-    const viz::FrameSinkId& frame_sink_id) {
+    const FrameSinkId& frame_sink_id) {
   DCHECK_EQ(surface_manager_.GetValidFrameSinkIds().count(frame_sink_id), 1u);
   auto client_iter = clients_.find(frame_sink_id);
   DCHECK(client_iter != clients_.end());
@@ -73,8 +72,8 @@
 }
 
 void FrameSinkManager::RegisterBeginFrameSource(
-    BeginFrameSource* source,
-    const viz::FrameSinkId& frame_sink_id) {
+    cc::BeginFrameSource* source,
+    const FrameSinkId& frame_sink_id) {
   DCHECK(source);
   DCHECK_EQ(registered_sources_.count(source), 0u);
   DCHECK_EQ(surface_manager_.GetValidFrameSinkIds().count(frame_sink_id), 1u);
@@ -85,11 +84,12 @@
   primary_source_.OnBeginFrameSourceAdded(source);
 }
 
-void FrameSinkManager::UnregisterBeginFrameSource(BeginFrameSource* source) {
+void FrameSinkManager::UnregisterBeginFrameSource(
+    cc::BeginFrameSource* source) {
   DCHECK(source);
   DCHECK_EQ(registered_sources_.count(source), 1u);
 
-  viz::FrameSinkId frame_sink_id = registered_sources_[source];
+  FrameSinkId frame_sink_id = registered_sources_[source];
   registered_sources_.erase(source);
 
   primary_source_.OnBeginFrameSourceRemoved(source);
@@ -106,13 +106,13 @@
     RecursivelyAttachBeginFrameSource(source_iter.second, source_iter.first);
 }
 
-BeginFrameSource* FrameSinkManager::GetPrimaryBeginFrameSource() {
+cc::BeginFrameSource* FrameSinkManager::GetPrimaryBeginFrameSource() {
   return &primary_source_;
 }
 
 void FrameSinkManager::RecursivelyAttachBeginFrameSource(
-    const viz::FrameSinkId& frame_sink_id,
-    BeginFrameSource* source) {
+    const FrameSinkId& frame_sink_id,
+    cc::BeginFrameSource* source) {
   FrameSinkSourceMapping& mapping = frame_sink_source_map_[frame_sink_id];
   if (!mapping.source) {
     mapping.source = source;
@@ -122,17 +122,17 @@
   }
   for (size_t i = 0; i < mapping.children.size(); ++i) {
     // |frame_sink_source_map_| is a container that can allocate new memory and
-    // move data between buffers. Copy child's viz::FrameSinkId before passing
+    // move data between buffers. Copy child's FrameSinkId before passing
     // it to RecursivelyAttachBeginFrameSource so that we don't reference data
     // inside |frame_sink_source_map_|.
-    viz::FrameSinkId child_copy = mapping.children[i];
+    FrameSinkId child_copy = mapping.children[i];
     RecursivelyAttachBeginFrameSource(child_copy, source);
   }
 }
 
 void FrameSinkManager::RecursivelyDetachBeginFrameSource(
-    const viz::FrameSinkId& frame_sink_id,
-    BeginFrameSource* source) {
+    const FrameSinkId& frame_sink_id,
+    cc::BeginFrameSource* source) {
   auto iter = frame_sink_source_map_.find(frame_sink_id);
   if (iter == frame_sink_source_map_.end())
     return;
@@ -148,20 +148,20 @@
     return;
   }
 
-  std::vector<viz::FrameSinkId>& children = iter->second.children;
+  std::vector<FrameSinkId>& children = iter->second.children;
   for (size_t i = 0; i < children.size(); ++i) {
     RecursivelyDetachBeginFrameSource(children[i], source);
   }
 }
 
 bool FrameSinkManager::ChildContains(
-    const viz::FrameSinkId& child_frame_sink_id,
-    const viz::FrameSinkId& search_frame_sink_id) const {
+    const FrameSinkId& child_frame_sink_id,
+    const FrameSinkId& search_frame_sink_id) const {
   auto iter = frame_sink_source_map_.find(child_frame_sink_id);
   if (iter == frame_sink_source_map_.end())
     return false;
 
-  const std::vector<viz::FrameSinkId>& children = iter->second.children;
+  const std::vector<FrameSinkId>& children = iter->second.children;
   for (size_t i = 0; i < children.size(); ++i) {
     if (children[i] == search_frame_sink_id)
       return true;
@@ -172,13 +172,13 @@
 }
 
 void FrameSinkManager::RegisterFrameSinkHierarchy(
-    const viz::FrameSinkId& parent_frame_sink_id,
-    const viz::FrameSinkId& child_frame_sink_id) {
+    const FrameSinkId& parent_frame_sink_id,
+    const FrameSinkId& child_frame_sink_id) {
   // If it's possible to reach the parent through the child's descendant chain,
   // then this will create an infinite loop.  Might as well just crash here.
   CHECK(!ChildContains(child_frame_sink_id, parent_frame_sink_id));
 
-  std::vector<viz::FrameSinkId>& children =
+  std::vector<FrameSinkId>& children =
       frame_sink_source_map_[parent_frame_sink_id].children;
   for (size_t i = 0; i < children.size(); ++i)
     DCHECK(children[i] != child_frame_sink_id);
@@ -186,7 +186,7 @@
 
   // If the parent has no source, then attaching it to this child will
   // not change any downstream sources.
-  BeginFrameSource* parent_source =
+  cc::BeginFrameSource* parent_source =
       frame_sink_source_map_[parent_frame_sink_id].source;
   if (!parent_source)
     return;
@@ -196,10 +196,10 @@
 }
 
 void FrameSinkManager::UnregisterFrameSinkHierarchy(
-    const viz::FrameSinkId& parent_frame_sink_id,
-    const viz::FrameSinkId& child_frame_sink_id) {
+    const FrameSinkId& parent_frame_sink_id,
+    const FrameSinkId& child_frame_sink_id) {
   // Deliberately do not check validity of either parent or child
-  // viz::FrameSinkId here.  They were valid during the registration, so were
+  // FrameSinkId here.  They were valid during the registration, so were
   // valid at some point in time.  This makes it possible to invalidate parent
   // and child FrameSinkIds independently of each other and not have an ordering
   // dependency  of unregistering the hierarchy first before either of them.
@@ -207,7 +207,7 @@
 
   auto iter = frame_sink_source_map_.find(parent_frame_sink_id);
 
-  std::vector<viz::FrameSinkId>& children = iter->second.children;
+  std::vector<FrameSinkId>& children = iter->second.children;
   bool found_child = false;
   for (size_t i = 0; i < children.size(); ++i) {
     if (children[i] == child_frame_sink_id) {
@@ -230,7 +230,7 @@
 
   // If the parent does not have a begin frame source, then disconnecting it
   // will not change any of its children.
-  BeginFrameSource* parent_source = iter->second.source;
+  cc::BeginFrameSource* parent_source = iter->second.source;
   if (!parent_source)
     return;
 
@@ -240,9 +240,8 @@
     RecursivelyAttachBeginFrameSource(source_iter.second, source_iter.first);
 }
 
-void FrameSinkManager::DropTemporaryReference(
-    const viz::SurfaceId& surface_id) {
+void FrameSinkManager::DropTemporaryReference(const SurfaceId& surface_id) {
   surface_manager_.DropTemporaryReference(surface_id);
 }
 
-}  // namespace cc
+}  // namespace viz
diff --git a/components/viz/service/frame_sinks/frame_sink_manager.h b/components/viz/service/frame_sinks/frame_sink_manager.h
new file mode 100644
index 0000000..817c0f2
--- /dev/null
+++ b/components/viz/service/frame_sinks/frame_sink_manager.h
@@ -0,0 +1,139 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_VIZ_SERVICE_FRAME_SINKS_FRAME_SINK_MANAGER_H_
+#define COMPONENTS_VIZ_SERVICE_FRAME_SINKS_FRAME_SINK_MANAGER_H_
+
+#include <stdint.h>
+
+#include <unordered_map>
+#include <vector>
+
+#include "base/containers/flat_map.h"
+#include "base/logging.h"
+#include "base/macros.h"
+#include "cc/surfaces/primary_begin_frame_source.h"
+#include "cc/surfaces/surface_manager.h"
+#include "components/viz/common/surfaces/frame_sink_id.h"
+#include "components/viz/service/viz_service_export.h"
+
+namespace cc {
+
+class BeginFrameSource;
+
+namespace test {
+class SurfaceSynchronizationTest;
+}
+
+}  // namespace cc
+
+namespace viz {
+
+class FrameSinkManagerClient;
+
+// FrameSinkManager manages BeginFrame hierarchy. This is the implementation
+// detail for FrameSinkManagerImpl.
+// TODO(staraz): Merge FrameSinkManager into FrameSinkManagerImpl.
+class VIZ_SERVICE_EXPORT FrameSinkManager {
+ public:
+  explicit FrameSinkManager(cc::SurfaceManager::LifetimeType lifetime_type =
+                                cc::SurfaceManager::LifetimeType::SEQUENCES);
+  ~FrameSinkManager();
+
+  void RegisterFrameSinkId(const FrameSinkId& frame_sink_id);
+
+  // Invalidate a frame_sink_id that might still have associated sequences,
+  // possibly because a renderer process has crashed.
+  void InvalidateFrameSinkId(const FrameSinkId& frame_sink_id);
+
+  // CompositorFrameSinkSupport, hierarchy, and BeginFrameSource can be
+  // registered and unregistered in any order with respect to each other.
+  //
+  // This happens in practice, e.g. the relationship to between ui::Compositor /
+  // DelegatedFrameHost is known before ui::Compositor has a surface/client).
+  // However, DelegatedFrameHost can register itself as a client before its
+  // relationship with the ui::Compositor is known.
+
+  // Associates a FrameSinkManagerClient with the frame_sink_id it uses.
+  // FrameSinkManagerClient and framesink allocators have a 1:1 mapping.
+  // Caller guarantees the client is alive between register/unregister.
+  void RegisterFrameSinkManagerClient(const FrameSinkId& frame_sink_id,
+                                      FrameSinkManagerClient* client);
+  void UnregisterFrameSinkManagerClient(const FrameSinkId& frame_sink_id);
+
+  // Associates a |source| with a particular framesink.  That framesink and
+  // any children of that framesink with valid clients can potentially use
+  // that |source|.
+  void RegisterBeginFrameSource(cc::BeginFrameSource* source,
+                                const FrameSinkId& frame_sink_id);
+  void UnregisterBeginFrameSource(cc::BeginFrameSource* source);
+
+  // Returns a stable BeginFrameSource that forwards BeginFrames from the first
+  // available BeginFrameSource.
+  cc::BeginFrameSource* GetPrimaryBeginFrameSource();
+
+  // Register a relationship between two framesinks.  This relationship means
+  // that surfaces from the child framesik will be displayed in the parent.
+  // Children are allowed to use any begin frame source that their parent can
+  // use.
+  void RegisterFrameSinkHierarchy(const FrameSinkId& parent_frame_sink_id,
+                                  const FrameSinkId& child_frame_sink_id);
+  void UnregisterFrameSinkHierarchy(const FrameSinkId& parent_frame_sink_id,
+                                    const FrameSinkId& child_frame_sink_id);
+
+  // Drops the temporary reference for |surface_id|. If a surface reference has
+  // already been added from the parent to |surface_id| then this will do
+  // nothing.
+  void DropTemporaryReference(const SurfaceId& surface_id);
+
+  cc::SurfaceManager* surface_manager() { return &surface_manager_; }
+
+ private:
+  friend class cc::test::SurfaceSynchronizationTest;
+
+  void RecursivelyAttachBeginFrameSource(const FrameSinkId& frame_sink_id,
+                                         cc::BeginFrameSource* source);
+  void RecursivelyDetachBeginFrameSource(const FrameSinkId& frame_sink_id,
+                                         cc::BeginFrameSource* source);
+
+  // Returns true if |child framesink| is or has |search_frame_sink_id| as a
+  // child.
+  bool ChildContains(const FrameSinkId& child_frame_sink_id,
+                     const FrameSinkId& search_frame_sink_id) const;
+
+  // Begin frame source routing. Both BeginFrameSource and
+  // CompositorFrameSinkSupport pointers guaranteed alive by callers until
+  // unregistered.
+  struct FrameSinkSourceMapping {
+    FrameSinkSourceMapping();
+    FrameSinkSourceMapping(const FrameSinkSourceMapping& other);
+    ~FrameSinkSourceMapping();
+    bool has_children() const { return !children.empty(); }
+    // The currently assigned begin frame source for this client.
+    cc::BeginFrameSource* source = nullptr;
+    // This represents a dag of parent -> children mapping.
+    std::vector<FrameSinkId> children;
+  };
+
+  base::flat_map<FrameSinkId, FrameSinkManagerClient*> clients_;
+  std::unordered_map<FrameSinkId, FrameSinkSourceMapping, FrameSinkIdHash>
+      frame_sink_source_map_;
+
+  // Set of BeginFrameSource along with associated FrameSinkIds. Any child
+  // that is implicitly using this framesink must be reachable by the
+  // parent in the dag.
+  std::unordered_map<cc::BeginFrameSource*, FrameSinkId> registered_sources_;
+
+  cc::PrimaryBeginFrameSource primary_source_;
+
+  // |surface_manager_| should be placed under |primary_source_| so that all
+  // surfaces are destroyed before |primary_source_|.
+  cc::SurfaceManager surface_manager_;
+
+  DISALLOW_COPY_AND_ASSIGN(FrameSinkManager);
+};
+
+}  // namespace viz
+
+#endif  // COMPONENTS_VIZ_SERVICE_FRAME_SINKS_FRAME_SINK_MANAGER_H_
diff --git a/components/viz/service/frame_sinks/frame_sink_manager_client.h b/components/viz/service/frame_sinks/frame_sink_manager_client.h
new file mode 100644
index 0000000..456d05bb
--- /dev/null
+++ b/components/viz/service/frame_sinks/frame_sink_manager_client.h
@@ -0,0 +1,27 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_VIZ_SERVICE_FRAME_SINKS_FRAME_SINK_MANAGER_CLIENT_H_
+#define COMPONENTS_VIZ_SERVICE_FRAME_SINKS_FRAME_SINK_MANAGER_CLIENT_H_
+
+#include "components/viz/service/viz_service_export.h"
+
+namespace cc {
+class BeginFrameSource;
+}
+
+namespace viz {
+
+class VIZ_SERVICE_EXPORT FrameSinkManagerClient {
+ public:
+  virtual ~FrameSinkManagerClient() = default;
+
+  // This allows the FrameSinkManager to pass a BeginFrameSource to use.
+  virtual void SetBeginFrameSource(
+      cc::BeginFrameSource* begin_frame_source) = 0;
+};
+
+}  // namespace viz
+
+#endif  // COMPONENTS_VIZ_SERVICE_FRAME_SINKS_FRAME_SINK_MANAGER_CLIENT_H_
diff --git a/components/viz/service/frame_sinks/frame_sink_manager_impl.h b/components/viz/service/frame_sinks/frame_sink_manager_impl.h
index 7dc4f105..b97f905d 100644
--- a/components/viz/service/frame_sinks/frame_sink_manager_impl.h
+++ b/components/viz/service/frame_sinks/frame_sink_manager_impl.h
@@ -14,9 +14,9 @@
 #include "base/memory/ref_counted.h"
 #include "base/threading/thread_checker.h"
 #include "cc/ipc/frame_sink_manager.mojom.h"
-#include "cc/surfaces/frame_sink_manager.h"
 #include "cc/surfaces/surface_observer.h"
 #include "components/viz/common/surfaces/frame_sink_id.h"
+#include "components/viz/service/frame_sinks/frame_sink_manager.h"
 #include "components/viz/service/frame_sinks/gpu_compositor_frame_sink_delegate.h"
 #include "components/viz/service/viz_service_export.h"
 #include "gpu/ipc/common/surface_handle.h"
@@ -47,7 +47,7 @@
                        DisplayProvider* display_provider);
   ~FrameSinkManagerImpl() override;
 
-  cc::FrameSinkManager* frame_sink_manager() { return &manager_; }
+  viz::FrameSinkManager* frame_sink_manager() { return &manager_; }
 
   // Binds |this| as a FrameSinkManager for |request| on |task_runner|. On Mac
   // |task_runner| will be the resize helper task runner. May only be called
@@ -103,7 +103,7 @@
   // FrameSinkManager should be the first object constructed and the last object
   // destroyed in order to ensure that all other objects that depend on it have
   // access to a valid pointer for the entirety of their lifetimes.
-  cc::FrameSinkManager manager_;
+  viz::FrameSinkManager manager_;
 
   // Provides a Display for CreateRootCompositorFrameSink().
   DisplayProvider* const display_provider_;
diff --git a/cc/surfaces/frame_sink_manager_unittest.cc b/components/viz/service/frame_sinks/frame_sink_manager_unittest.cc
similarity index 85%
rename from cc/surfaces/frame_sink_manager_unittest.cc
rename to components/viz/service/frame_sinks/frame_sink_manager_unittest.cc
index 3b1d945b..977351c 100644
--- a/cc/surfaces/frame_sink_manager_unittest.cc
+++ b/components/viz/service/frame_sinks/frame_sink_manager_unittest.cc
@@ -5,25 +5,25 @@
 #include <stddef.h>
 
 #include "cc/scheduler/begin_frame_source.h"
-#include "cc/surfaces/frame_sink_manager.h"
-#include "cc/surfaces/frame_sink_manager_client.h"
 #include "cc/test/begin_frame_source_test.h"
 #include "cc/test/fake_external_begin_frame_source.h"
+#include "components/viz/service/frame_sinks/frame_sink_manager.h"
+#include "components/viz/service/frame_sinks/frame_sink_manager_client.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-namespace cc {
+namespace viz {
 
 namespace {
 
-constexpr viz::FrameSinkId kArbitraryFrameSinkId(1, 1);
+constexpr FrameSinkId kArbitraryFrameSinkId(1, 1);
 }
 
 class FakeFrameSinkManagerClient : public FrameSinkManagerClient {
  public:
-  explicit FakeFrameSinkManagerClient(const viz::FrameSinkId& frame_sink_id)
+  explicit FakeFrameSinkManagerClient(const FrameSinkId& frame_sink_id)
       : source_(nullptr), manager_(nullptr), frame_sink_id_(frame_sink_id) {}
 
-  FakeFrameSinkManagerClient(const viz::FrameSinkId& frame_sink_id,
+  FakeFrameSinkManagerClient(const FrameSinkId& frame_sink_id,
                              FrameSinkManager* manager)
       : source_(nullptr), manager_(nullptr), frame_sink_id_(frame_sink_id) {
     DCHECK(manager);
@@ -37,8 +37,8 @@
     EXPECT_EQ(nullptr, source_);
   }
 
-  BeginFrameSource* source() { return source_; }
-  const viz::FrameSinkId& frame_sink_id() { return frame_sink_id_; }
+  cc::BeginFrameSource* source() { return source_; }
+  const FrameSinkId& frame_sink_id() { return frame_sink_id_; }
 
   void Register(FrameSinkManager* manager) {
     EXPECT_EQ(nullptr, manager_);
@@ -53,15 +53,15 @@
   }
 
   // FrameSinkManagerClient implementation.
-  void SetBeginFrameSource(BeginFrameSource* begin_frame_source) override {
+  void SetBeginFrameSource(cc::BeginFrameSource* begin_frame_source) override {
     DCHECK(!source_ || !begin_frame_source);
     source_ = begin_frame_source;
   }
 
  private:
-  BeginFrameSource* source_;
+  cc::BeginFrameSource* source_;
   FrameSinkManager* manager_;
-  viz::FrameSinkId frame_sink_id_;
+  FrameSinkId frame_sink_id_;
 };
 
 class FrameSinkManagerTest : public testing::Test {
@@ -73,12 +73,12 @@
 
   FrameSinkManagerTest() {
     for (size_t i = 0; i < MAX_FRAME_SINK; ++i)
-      manager_.RegisterFrameSinkId(viz::FrameSinkId(i, i));
+      manager_.RegisterFrameSinkId(FrameSinkId(i, i));
   }
 
   ~FrameSinkManagerTest() override {
     for (size_t i = 0; i < MAX_FRAME_SINK; ++i)
-      manager_.InvalidateFrameSinkId(viz::FrameSinkId(i, i));
+      manager_.InvalidateFrameSinkId(FrameSinkId(i, i));
   }
 
  protected:
@@ -86,9 +86,9 @@
 };
 
 TEST_F(FrameSinkManagerTest, SingleClients) {
-  FakeFrameSinkManagerClient client(viz::FrameSinkId(1, 1));
-  FakeFrameSinkManagerClient other_client(viz::FrameSinkId(2, 2));
-  StubBeginFrameSource source;
+  FakeFrameSinkManagerClient client(FrameSinkId(1, 1));
+  FakeFrameSinkManagerClient other_client(FrameSinkId(2, 2));
+  cc::StubBeginFrameSource source;
 
   EXPECT_EQ(nullptr, client.source());
   EXPECT_EQ(nullptr, other_client.source());
@@ -124,7 +124,7 @@
 // after restart.
 TEST_F(FrameSinkManagerTest, ClientRestart) {
   FakeFrameSinkManagerClient client(kArbitraryFrameSinkId);
-  StubBeginFrameSource source;
+  cc::StubBeginFrameSource source;
   client.Register(&manager_);
 
   manager_.RegisterBeginFrameSource(&source, kArbitraryFrameSinkId);
@@ -148,24 +148,25 @@
 TEST_F(FrameSinkManagerTest, PrimaryBeginFrameSource) {
   // This PrimaryBeginFrameSource should track the first BeginFrameSource
   // registered with the SurfaceManager.
-  testing::NiceMock<MockBeginFrameObserver> obs;
-  BeginFrameSource* begin_frame_source = manager_.GetPrimaryBeginFrameSource();
+  testing::NiceMock<cc::MockBeginFrameObserver> obs;
+  cc::BeginFrameSource* begin_frame_source =
+      manager_.GetPrimaryBeginFrameSource();
   begin_frame_source->AddObserver(&obs);
 
-  FakeFrameSinkManagerClient root1(viz::FrameSinkId(1, 1), &manager_);
-  std::unique_ptr<FakeExternalBeginFrameSource> external_source1 =
-      base::MakeUnique<FakeExternalBeginFrameSource>(60.f, false);
+  FakeFrameSinkManagerClient root1(FrameSinkId(1, 1), &manager_);
+  std::unique_ptr<cc::FakeExternalBeginFrameSource> external_source1 =
+      base::MakeUnique<cc::FakeExternalBeginFrameSource>(60.f, false);
   manager_.RegisterBeginFrameSource(external_source1.get(),
                                     root1.frame_sink_id());
 
-  FakeFrameSinkManagerClient root2(viz::FrameSinkId(2, 2), &manager_);
-  std::unique_ptr<FakeExternalBeginFrameSource> external_source2 =
-      base::MakeUnique<FakeExternalBeginFrameSource>(60.f, false);
+  FakeFrameSinkManagerClient root2(FrameSinkId(2, 2), &manager_);
+  std::unique_ptr<cc::FakeExternalBeginFrameSource> external_source2 =
+      base::MakeUnique<cc::FakeExternalBeginFrameSource>(60.f, false);
   manager_.RegisterBeginFrameSource(external_source2.get(),
                                     root2.frame_sink_id());
 
-  BeginFrameArgs args =
-      CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 1);
+  cc::BeginFrameArgs args =
+      cc::CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 1);
 
   // Ticking |external_source2| does not propagate to |begin_frame_source|.
   {
@@ -202,16 +203,16 @@
 }
 
 TEST_F(FrameSinkManagerTest, MultipleDisplays) {
-  StubBeginFrameSource root1_source;
-  StubBeginFrameSource root2_source;
+  cc::StubBeginFrameSource root1_source;
+  cc::StubBeginFrameSource root2_source;
 
   // root1 -> A -> B
   // root2 -> C
-  FakeFrameSinkManagerClient root1(viz::FrameSinkId(1, 1), &manager_);
-  FakeFrameSinkManagerClient root2(viz::FrameSinkId(2, 2), &manager_);
-  FakeFrameSinkManagerClient client_a(viz::FrameSinkId(3, 3), &manager_);
-  FakeFrameSinkManagerClient client_b(viz::FrameSinkId(4, 4), &manager_);
-  FakeFrameSinkManagerClient client_c(viz::FrameSinkId(5, 5), &manager_);
+  FakeFrameSinkManagerClient root1(FrameSinkId(1, 1), &manager_);
+  FakeFrameSinkManagerClient root2(FrameSinkId(2, 2), &manager_);
+  FakeFrameSinkManagerClient client_a(FrameSinkId(3, 3), &manager_);
+  FakeFrameSinkManagerClient client_b(FrameSinkId(4, 4), &manager_);
+  FakeFrameSinkManagerClient client_c(FrameSinkId(5, 5), &manager_);
 
   manager_.RegisterBeginFrameSource(&root1_source, root1.frame_sink_id());
   manager_.RegisterBeginFrameSource(&root2_source, root2.frame_sink_id());
@@ -269,15 +270,15 @@
 }
 
 // This test verifies that a BeginFrameSource path to the root from a
-// viz::FrameSinkId is preserved even if that viz::FrameSinkId has no children
+// FrameSinkId is preserved even if that FrameSinkId has no children
 // and does not have a corresponding FrameSinkManagerClient.
 TEST_F(FrameSinkManagerTest, ParentWithoutClientRetained) {
-  StubBeginFrameSource root_source;
+  cc::StubBeginFrameSource root_source;
 
-  constexpr viz::FrameSinkId kFrameSinkIdRoot(1, 1);
-  constexpr viz::FrameSinkId kFrameSinkIdA(2, 2);
-  constexpr viz::FrameSinkId kFrameSinkIdB(3, 3);
-  constexpr viz::FrameSinkId kFrameSinkIdC(4, 4);
+  constexpr FrameSinkId kFrameSinkIdRoot(1, 1);
+  constexpr FrameSinkId kFrameSinkIdA(2, 2);
+  constexpr FrameSinkId kFrameSinkIdB(3, 3);
+  constexpr FrameSinkId kFrameSinkIdC(4, 4);
 
   FakeFrameSinkManagerClient root(kFrameSinkIdRoot, &manager_);
   FakeFrameSinkManagerClient client_b(kFrameSinkIdB, &manager_);
@@ -311,12 +312,12 @@
 // propagates all the way to C.
 TEST_F(FrameSinkManagerTest,
        ParentWithoutClientRetained_LateBeginFrameRegistration) {
-  StubBeginFrameSource root_source;
+  cc::StubBeginFrameSource root_source;
 
-  constexpr viz::FrameSinkId kFrameSinkIdRoot(1, 1);
-  constexpr viz::FrameSinkId kFrameSinkIdA(2, 2);
-  constexpr viz::FrameSinkId kFrameSinkIdB(3, 3);
-  constexpr viz::FrameSinkId kFrameSinkIdC(4, 4);
+  constexpr FrameSinkId kFrameSinkIdRoot(1, 1);
+  constexpr FrameSinkId kFrameSinkIdA(2, 2);
+  constexpr FrameSinkId kFrameSinkIdB(3, 3);
+  constexpr FrameSinkId kFrameSinkIdC(4, 4);
 
   FakeFrameSinkManagerClient root(kFrameSinkIdRoot, &manager_);
   FakeFrameSinkManagerClient client_b(kFrameSinkIdB, &manager_);
@@ -354,9 +355,9 @@
 class SurfaceManagerOrderingTest : public FrameSinkManagerTest {
  public:
   SurfaceManagerOrderingTest()
-      : client_a_(viz::FrameSinkId(1, 1)),
-        client_b_(viz::FrameSinkId(2, 2)),
-        client_c_(viz::FrameSinkId(3, 3)),
+      : client_a_(FrameSinkId(1, 1)),
+        client_b_(FrameSinkId(2, 2)),
+        client_c_(FrameSinkId(3, 3)),
         hierarchy_registered_(false),
         clients_registered_(false),
         bfs_registered_(false) {
@@ -449,7 +450,7 @@
     AssertAllValidBFS();
   }
 
-  StubBeginFrameSource source_;
+  cc::StubBeginFrameSource source_;
   // A -> B -> C hierarchy, with A always having the BFS.
   FakeFrameSinkManagerClient client_a_;
   FakeFrameSinkManagerClient client_b_;
@@ -536,4 +537,4 @@
                        ::testing::ValuesIn(kUnregisterOrderList),
                        ::testing::ValuesIn(kBFSOrderList)));
 
-}  // namespace cc
+}  // namespace viz
diff --git a/components/viz/service/frame_sinks/gpu_compositor_frame_sink.cc b/components/viz/service/frame_sinks/gpu_compositor_frame_sink.cc
index cde9de05..3ceac0d 100644
--- a/components/viz/service/frame_sinks/gpu_compositor_frame_sink.cc
+++ b/components/viz/service/frame_sinks/gpu_compositor_frame_sink.cc
@@ -10,7 +10,7 @@
 
 GpuCompositorFrameSink::GpuCompositorFrameSink(
     GpuCompositorFrameSinkDelegate* delegate,
-    cc::FrameSinkManager* frame_sink_manager,
+    FrameSinkManager* frame_sink_manager,
     const FrameSinkId& frame_sink_id,
     cc::mojom::CompositorFrameSinkRequest request,
     cc::mojom::CompositorFrameSinkPrivateRequest
diff --git a/components/viz/service/frame_sinks/gpu_compositor_frame_sink.h b/components/viz/service/frame_sinks/gpu_compositor_frame_sink.h
index e683fd5f..f38db0cb1 100644
--- a/components/viz/service/frame_sinks/gpu_compositor_frame_sink.h
+++ b/components/viz/service/frame_sinks/gpu_compositor_frame_sink.h
@@ -28,7 +28,7 @@
  public:
   GpuCompositorFrameSink(
       GpuCompositorFrameSinkDelegate* delegate,
-      cc::FrameSinkManager* frame_sink_manager,
+      FrameSinkManager* frame_sink_manager,
       const FrameSinkId& frame_sink_id,
       cc::mojom::CompositorFrameSinkRequest request,
       cc::mojom::CompositorFrameSinkPrivateRequest private_request,
diff --git a/components/viz/service/frame_sinks/gpu_root_compositor_frame_sink.cc b/components/viz/service/frame_sinks/gpu_root_compositor_frame_sink.cc
index 9fb41d0..41bde869 100644
--- a/components/viz/service/frame_sinks/gpu_root_compositor_frame_sink.cc
+++ b/components/viz/service/frame_sinks/gpu_root_compositor_frame_sink.cc
@@ -6,15 +6,15 @@
 
 #include <utility>
 
-#include "cc/surfaces/frame_sink_manager.h"
 #include "components/viz/service/display/display.h"
 #include "components/viz/service/frame_sinks/compositor_frame_sink_support.h"
+#include "components/viz/service/frame_sinks/frame_sink_manager.h"
 
 namespace viz {
 
 GpuRootCompositorFrameSink::GpuRootCompositorFrameSink(
     GpuCompositorFrameSinkDelegate* delegate,
-    cc::FrameSinkManager* frame_sink_manager,
+    FrameSinkManager* frame_sink_manager,
     const FrameSinkId& frame_sink_id,
     std::unique_ptr<Display> display,
     std::unique_ptr<cc::BeginFrameSource> begin_frame_source,
diff --git a/components/viz/service/frame_sinks/gpu_root_compositor_frame_sink.h b/components/viz/service/frame_sinks/gpu_root_compositor_frame_sink.h
index 9a67dbe..2defc9d 100644
--- a/components/viz/service/frame_sinks/gpu_root_compositor_frame_sink.h
+++ b/components/viz/service/frame_sinks/gpu_root_compositor_frame_sink.h
@@ -19,10 +19,10 @@
 
 namespace cc {
 class BeginFrameSource;
-class FrameSinkManager;
 }
 
 namespace viz {
+class FrameSinkManager;
 class CompositorFrameSinkSupport;
 class Display;
 
@@ -37,7 +37,7 @@
  public:
   GpuRootCompositorFrameSink(
       GpuCompositorFrameSinkDelegate* delegate,
-      cc::FrameSinkManager* frame_sink_manager,
+      FrameSinkManager* frame_sink_manager,
       const FrameSinkId& frame_sink_id,
       std::unique_ptr<Display> display,
       std::unique_ptr<cc::BeginFrameSource> begin_frame_source,
diff --git a/components/viz/test/test_layer_tree_frame_sink.cc b/components/viz/test/test_layer_tree_frame_sink.cc
index 3c1f2f6..c1708a1 100644
--- a/components/viz/test/test_layer_tree_frame_sink.cc
+++ b/components/viz/test/test_layer_tree_frame_sink.cc
@@ -41,7 +41,7 @@
       refresh_rate_(refresh_rate),
       task_runner_(std::move(task_runner)),
       frame_sink_id_(kLayerTreeFrameSinkId),
-      frame_sink_manager_(new cc::FrameSinkManager),
+      frame_sink_manager_(new FrameSinkManager),
       local_surface_id_allocator_(new LocalSurfaceIdAllocator),
       external_begin_frame_source_(this),
       weak_ptr_factory_(this) {
diff --git a/components/viz/test/test_layer_tree_frame_sink.h b/components/viz/test/test_layer_tree_frame_sink.h
index 73f01a7..5ee1e80 100644
--- a/components/viz/test/test_layer_tree_frame_sink.h
+++ b/components/viz/test/test_layer_tree_frame_sink.h
@@ -10,11 +10,11 @@
 #include "cc/output/layer_tree_frame_sink.h"
 #include "cc/output/renderer_settings.h"
 #include "cc/scheduler/begin_frame_source.h"
-#include "cc/surfaces/frame_sink_manager.h"
 #include "components/viz/common/surfaces/local_surface_id_allocator.h"
 #include "components/viz/service/display/display.h"
 #include "components/viz/service/display/display_client.h"
 #include "components/viz/service/frame_sinks/compositor_frame_sink_support_client.h"
+#include "components/viz/service/frame_sinks/frame_sink_manager.h"
 
 namespace base {
 class SingleThreadTaskRunner;
@@ -118,7 +118,7 @@
   FrameSinkId frame_sink_id_;
   // TODO(danakj): These don't need to be stored in unique_ptrs when
   // LayerTreeFrameSink is owned/destroyed on the compositor thread.
-  std::unique_ptr<cc::FrameSinkManager> frame_sink_manager_;
+  std::unique_ptr<FrameSinkManager> frame_sink_manager_;
   std::unique_ptr<LocalSurfaceIdAllocator> local_surface_id_allocator_;
   LocalSurfaceId local_surface_id_;
   gfx::Size display_size_;
diff --git a/content/BUILD.gn b/content/BUILD.gn
index 05c3876..5a0d26f 100644
--- a/content/BUILD.gn
+++ b/content/BUILD.gn
@@ -63,8 +63,9 @@
     "//content/network:network_sources",
     "//content/public/browser:browser_sources",
     "//content/public/child:child_sources",
-    "//content/public/gpu:gpu_sources",
     "//content/public/common:common_sources",
+    "//content/public/gpu:gpu_sources",
+    "//content/public/network:network_sources",
     "//content/public/renderer:renderer_sources",
     "//content/public/utility:utility_sources",
   ]
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index e069154..152d6e4 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -560,6 +560,8 @@
     "devtools/protocol/storage_handler.h",
     "devtools/protocol/system_info_handler.cc",
     "devtools/protocol/system_info_handler.h",
+    "devtools/protocol/target_auto_attacher.cc",
+    "devtools/protocol/target_auto_attacher.h",
     "devtools/protocol/target_handler.cc",
     "devtools/protocol/target_handler.h",
     "devtools/protocol/tethering_handler.cc",
@@ -1111,6 +1113,8 @@
     "renderer_host/clipboard_message_filter.cc",
     "renderer_host/clipboard_message_filter.h",
     "renderer_host/clipboard_message_filter_mac.mm",
+    "renderer_host/cursor_manager.cc",
+    "renderer_host/cursor_manager.h",
     "renderer_host/database_message_filter.cc",
     "renderer_host/database_message_filter.h",
     "renderer_host/dip_util.cc",
diff --git a/content/browser/blob_storage/blob_url_unittest.cc b/content/browser/blob_storage/blob_url_unittest.cc
index 32b4837..a59b631 100644
--- a/content/browser/blob_storage/blob_url_unittest.cc
+++ b/content/browser/blob_storage/blob_url_unittest.cc
@@ -20,9 +20,9 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
 #include "content/browser/blob_storage/blob_url_loader_factory.h"
-#include "content/browser/loader/test_url_loader_client.h"
 #include "content/browser/url_loader_factory_getter.h"
 #include "content/public/test/test_browser_thread_bundle.h"
+#include "content/public/test/test_url_loader_client.h"
 #include "mojo/common/data_pipe_utils.h"
 #include "net/base/net_errors.h"
 #include "net/base/request_priority.h"
diff --git a/content/browser/browser_main_loop.cc b/content/browser/browser_main_loop.cc
index f909c05..c2db985f 100644
--- a/content/browser/browser_main_loop.cc
+++ b/content/browser/browser_main_loop.cc
@@ -1373,7 +1373,7 @@
 }
 
 #if !defined(OS_ANDROID)
-cc::FrameSinkManager* BrowserMainLoop::GetFrameSinkManager() const {
+viz::FrameSinkManager* BrowserMainLoop::GetFrameSinkManager() const {
   return frame_sink_manager_impl_->frame_sink_manager();
 }
 #endif
diff --git a/content/browser/browser_main_loop.h b/content/browser/browser_main_loop.h
index 5e2e06b..03942f08 100644
--- a/content/browser/browser_main_loop.h
+++ b/content/browser/browser_main_loop.h
@@ -36,10 +36,6 @@
 }  // namespace trace_event
 }  // namespace base
 
-namespace cc {
-class FrameSinkManager;
-}
-
 namespace discardable_memory {
 class DiscardableSharedMemoryManager;
 }
@@ -87,6 +83,7 @@
 #endif
 
 namespace viz {
+class FrameSinkManager;
 class HostFrameSinkManager;
 class FrameSinkManagerImpl;
 }
@@ -196,7 +193,7 @@
 
   // TODO(crbug.com/657959): This will be removed once there are no users, as
   // SurfaceManager is being moved out of process.
-  cc::FrameSinkManager* GetFrameSinkManager() const;
+  viz::FrameSinkManager* GetFrameSinkManager() const;
 #endif
 
   void StopStartupTracingTimer();
diff --git a/content/browser/browser_plugin/browser_plugin_guest.cc b/content/browser/browser_plugin/browser_plugin_guest.cc
index 3c529aa..7615c06 100644
--- a/content/browser/browser_plugin/browser_plugin_guest.cc
+++ b/content/browser/browser_plugin/browser_plugin_guest.cc
@@ -15,9 +15,9 @@
 #include "base/pickle.h"
 #include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
-#include "cc/surfaces/frame_sink_manager.h"
 #include "cc/surfaces/surface.h"
 #include "components/viz/common/surfaces/surface_info.h"
+#include "components/viz/service/frame_sinks/frame_sink_manager.h"
 #include "content/browser/browser_plugin/browser_plugin_embedder.h"
 #include "content/browser/browser_thread_impl.h"
 #include "content/browser/child_process_security_policy_impl.h"
diff --git a/content/browser/compositor/gpu_process_transport_factory.cc b/content/browser/compositor/gpu_process_transport_factory.cc
index 46dbbd1..c12b2aeb 100644
--- a/content/browser/compositor/gpu_process_transport_factory.cc
+++ b/content/browser/compositor/gpu_process_transport_factory.cc
@@ -26,7 +26,6 @@
 #include "cc/raster/task_graph_runner.h"
 #include "cc/scheduler/begin_frame_source.h"
 #include "cc/scheduler/delay_based_time_source.h"
-#include "cc/surfaces/frame_sink_manager.h"
 #include "components/viz/common/gl_helper.h"
 #include "components/viz/host/host_frame_sink_manager.h"
 #include "components/viz/service/display/display.h"
@@ -34,6 +33,7 @@
 #include "components/viz/service/display_embedder/compositor_overlay_candidate_validator.h"
 #include "components/viz/service/display_embedder/server_shared_bitmap_manager.h"
 #include "components/viz/service/frame_sinks/direct_layer_tree_frame_sink.h"
+#include "components/viz/service/frame_sinks/frame_sink_manager.h"
 #include "content/browser/browser_main_loop.h"
 #include "content/browser/compositor/browser_compositor_output_surface.h"
 #include "content/browser/compositor/gpu_browser_compositor_output_surface.h"
@@ -824,7 +824,7 @@
   observer_list_.RemoveObserver(observer);
 }
 
-cc::FrameSinkManager* GpuProcessTransportFactory::GetFrameSinkManager() {
+viz::FrameSinkManager* GpuProcessTransportFactory::GetFrameSinkManager() {
   return BrowserMainLoop::GetInstance()->GetFrameSinkManager();
 }
 
diff --git a/content/browser/compositor/gpu_process_transport_factory.h b/content/browser/compositor/gpu_process_transport_factory.h
index 2f8e00e..f209923 100644
--- a/content/browser/compositor/gpu_process_transport_factory.h
+++ b/content/browser/compositor/gpu_process_transport_factory.h
@@ -85,7 +85,7 @@
   // ImageTransportFactory implementation.
   ui::ContextFactory* GetContextFactory() override;
   ui::ContextFactoryPrivate* GetContextFactoryPrivate() override;
-  cc::FrameSinkManager* GetFrameSinkManager() override;
+  viz::FrameSinkManager* GetFrameSinkManager() override;
   viz::GLHelper* GetGLHelper() override;
   void SetGpuChannelEstablishFactory(
       gpu::GpuChannelEstablishFactory* factory) override;
diff --git a/content/browser/compositor/surface_utils.cc b/content/browser/compositor/surface_utils.cc
index 4fe579b..ee1d844 100644
--- a/content/browser/compositor/surface_utils.cc
+++ b/content/browser/compositor/surface_utils.cc
@@ -164,7 +164,7 @@
 #endif
 }
 
-cc::FrameSinkManager* GetFrameSinkManager() {
+viz::FrameSinkManager* GetFrameSinkManager() {
 #if defined(OS_ANDROID)
   return CompositorImpl::GetFrameSinkManager();
 #else
diff --git a/content/browser/compositor/surface_utils.h b/content/browser/compositor/surface_utils.h
index 348090f..1662845 100644
--- a/content/browser/compositor/surface_utils.h
+++ b/content/browser/compositor/surface_utils.h
@@ -20,10 +20,10 @@
 
 namespace cc {
 class CopyOutputResult;
-class FrameSinkManager;
 }  // namespace cc
 
 namespace viz {
+class FrameSinkManager;
 class HostFrameSinkManager;
 class FrameSinkManagerImpl;
 }
@@ -32,7 +32,7 @@
 
 CONTENT_EXPORT viz::FrameSinkId AllocateFrameSinkId();
 
-CONTENT_EXPORT cc::FrameSinkManager* GetFrameSinkManager();
+CONTENT_EXPORT viz::FrameSinkManager* GetFrameSinkManager();
 
 CONTENT_EXPORT viz::HostFrameSinkManager* GetHostFrameSinkManager();
 
diff --git a/content/browser/devtools/protocol/page_handler.cc b/content/browser/devtools/protocol/page_handler.cc
index d8b0b164..6d39844e 100644
--- a/content/browser/devtools/protocol/page_handler.cc
+++ b/content/browser/devtools/protocol/page_handler.cc
@@ -394,9 +394,10 @@
     emulation_handler_->SetDeviceEmulationParams(modified_params);
 
     if (clip.isJust()) {
-      widget_host->GetView()->SetSize(gfx::ScaleToCeiledSize(
-          gfx::Size(clip.fromJust()->GetWidth(), clip.fromJust()->GetHeight()),
-          dpfactor * clip.fromJust()->GetScale()));
+      double scale = dpfactor * clip.fromJust()->GetScale();
+      widget_host->GetView()->SetSize(
+          gfx::Size(gfx::ToRoundedInt(clip.fromJust()->GetWidth() * scale),
+                    gfx::ToRoundedInt(clip.fromJust()->GetHeight() * scale)));
     } else {
       widget_host->GetView()->SetSize(
           gfx::ScaleToFlooredSize(emulated_view_size, dpfactor));
diff --git a/content/browser/devtools/protocol/target_auto_attacher.cc b/content/browser/devtools/protocol/target_auto_attacher.cc
new file mode 100644
index 0000000..dbccd7b
--- /dev/null
+++ b/content/browser/devtools/protocol/target_auto_attacher.cc
@@ -0,0 +1,256 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/devtools/protocol/target_auto_attacher.h"
+
+#include "content/browser/devtools/render_frame_devtools_agent_host.h"
+#include "content/browser/devtools/service_worker_devtools_agent_host.h"
+#include "content/browser/frame_host/frame_tree.h"
+#include "content/browser/frame_host/frame_tree_node.h"
+#include "content/browser/frame_host/render_frame_host_impl.h"
+
+namespace content {
+namespace protocol {
+
+namespace {
+
+using ScopeAgentsMap =
+    std::map<GURL, std::unique_ptr<ServiceWorkerDevToolsAgentHost::List>>;
+
+void GetMatchingHostsByScopeMap(
+    const ServiceWorkerDevToolsAgentHost::List& agent_hosts,
+    const base::flat_set<GURL>& urls,
+    ScopeAgentsMap* scope_agents_map) {
+  base::flat_set<base::StringPiece> host_name_set;
+  for (const GURL& url : urls)
+    host_name_set.insert(url.host_piece());
+  for (const auto& host : agent_hosts) {
+    if (host_name_set.find(host->scope().host_piece()) == host_name_set.end())
+      continue;
+    const auto& it = scope_agents_map->find(host->scope());
+    if (it == scope_agents_map->end()) {
+      std::unique_ptr<ServiceWorkerDevToolsAgentHost::List> new_list(
+          new ServiceWorkerDevToolsAgentHost::List());
+      new_list->push_back(host);
+      (*scope_agents_map)[host->scope()] = std::move(new_list);
+    } else {
+      it->second->push_back(host);
+    }
+  }
+}
+
+void AddEligibleHosts(const ServiceWorkerDevToolsAgentHost::List& list,
+                      ServiceWorkerDevToolsAgentHost::Map* result) {
+  base::Time last_installed_time;
+  base::Time last_doomed_time;
+  for (const auto& host : list) {
+    if (host->version_installed_time() > last_installed_time)
+      last_installed_time = host->version_installed_time();
+    if (host->version_doomed_time() > last_doomed_time)
+      last_doomed_time = host->version_doomed_time();
+  }
+  for (const auto& host : list) {
+    // We don't attech old redundant Service Workers when there is newer
+    // installed Service Worker.
+    if (host->version_doomed_time().is_null() ||
+        (last_installed_time < last_doomed_time &&
+         last_doomed_time == host->version_doomed_time())) {
+      (*result)[host->GetId()] = host;
+    }
+  }
+}
+
+ServiceWorkerDevToolsAgentHost::Map GetMatchingServiceWorkers(
+    BrowserContext* browser_context,
+    const base::flat_set<GURL>& urls) {
+  ServiceWorkerDevToolsAgentHost::Map result;
+  if (!browser_context)
+    return result;
+
+  ServiceWorkerDevToolsAgentHost::List agent_hosts;
+  ServiceWorkerDevToolsManager::GetInstance()
+      ->AddAllAgentHostsForBrowserContext(browser_context, &agent_hosts);
+
+  ScopeAgentsMap scope_agents_map;
+  GetMatchingHostsByScopeMap(agent_hosts, urls, &scope_agents_map);
+
+  for (const auto& it : scope_agents_map)
+    AddEligibleHosts(*it.second.get(), &result);
+
+  return result;
+}
+
+}  // namespace
+
+TargetAutoAttacher::TargetAutoAttacher(AttachCallback attach_callback,
+                                       DetachCallback detach_callback)
+    : attach_callback_(attach_callback),
+      detach_callback_(detach_callback),
+      render_frame_host_(nullptr),
+      auto_attach_(false),
+      wait_for_debugger_on_start_(false),
+      attach_to_frames_(false) {}
+
+TargetAutoAttacher::~TargetAutoAttacher() {}
+
+void TargetAutoAttacher::SetRenderFrameHost(
+    RenderFrameHostImpl* render_frame_host) {
+  render_frame_host_ = render_frame_host;
+  UpdateFrames();
+  ReattachServiceWorkers(false);
+}
+
+void TargetAutoAttacher::UpdateServiceWorkers() {
+  ReattachServiceWorkers(false);
+}
+
+void TargetAutoAttacher::UpdateFrames() {
+  if (!auto_attach_ || !attach_to_frames_)
+    return;
+
+  Hosts new_hosts;
+  if (render_frame_host_) {
+    FrameTreeNode* root = render_frame_host_->frame_tree_node();
+    std::queue<FrameTreeNode*> queue;
+    queue.push(root);
+    while (!queue.empty()) {
+      FrameTreeNode* node = queue.front();
+      queue.pop();
+      bool cross_process = node->current_frame_host()->IsCrossProcessSubframe();
+      if (node != root && cross_process) {
+        scoped_refptr<DevToolsAgentHost> new_host =
+            RenderFrameDevToolsAgentHost::GetOrCreateFor(node);
+        new_hosts.insert(new_host);
+      } else {
+        for (size_t i = 0; i < node->child_count(); ++i)
+          queue.push(node->child_at(i));
+      }
+    }
+  }
+
+  // TODO(dgozman): support wait_for_debugger_on_start_.
+  ReattachTargetsOfType(new_hosts, DevToolsAgentHost::kTypeFrame, false);
+}
+
+void TargetAutoAttacher::AgentHostClosed(DevToolsAgentHost* host) {
+  auto_attached_hosts_.erase(host);
+}
+
+void TargetAutoAttacher::ReattachServiceWorkers(bool waiting_for_debugger) {
+  if (!auto_attach_)
+    return;
+
+  frame_urls_.clear();
+  BrowserContext* browser_context = nullptr;
+  if (render_frame_host_) {
+    // TODO(dgozman): do not traverse inside cross-process subframes.
+    for (FrameTreeNode* node :
+         render_frame_host_->frame_tree_node()->frame_tree()->Nodes()) {
+      frame_urls_.insert(node->current_url());
+    }
+    browser_context = render_frame_host_->GetProcess()->GetBrowserContext();
+  }
+
+  auto matching = GetMatchingServiceWorkers(browser_context, frame_urls_);
+  Hosts new_hosts;
+  for (const auto& pair : matching) {
+    if (pair.second->IsReadyForInspection())
+      new_hosts.insert(pair.second);
+  }
+  ReattachTargetsOfType(new_hosts, DevToolsAgentHost::kTypeServiceWorker,
+                        waiting_for_debugger);
+}
+
+void TargetAutoAttacher::ReattachTargetsOfType(const Hosts& new_hosts,
+                                               const std::string& type,
+                                               bool waiting_for_debugger) {
+  Hosts old_hosts = auto_attached_hosts_;
+  for (auto& it : old_hosts) {
+    DevToolsAgentHost* host = it.get();
+    if (host->GetType() == type && new_hosts.find(host) == new_hosts.end()) {
+      auto_attached_hosts_.erase(host);
+      detach_callback_.Run(host);
+    }
+  }
+  for (auto& it : new_hosts) {
+    DevToolsAgentHost* host = it.get();
+    if (old_hosts.find(host) == old_hosts.end()) {
+      if (attach_callback_.Run(host, waiting_for_debugger))
+        auto_attached_hosts_.insert(host);
+    }
+  }
+}
+
+void TargetAutoAttacher::SetAutoAttach(bool auto_attach,
+                                       bool wait_for_debugger_on_start) {
+  wait_for_debugger_on_start_ = wait_for_debugger_on_start;
+  if (auto_attach_ == auto_attach)
+    return;
+  auto_attach_ = auto_attach;
+  if (auto_attach_) {
+    ServiceWorkerDevToolsManager::GetInstance()->AddObserver(this);
+    ReattachServiceWorkers(false);
+    UpdateFrames();
+  } else {
+    ServiceWorkerDevToolsManager::GetInstance()->RemoveObserver(this);
+    Hosts empty;
+    ReattachTargetsOfType(empty, DevToolsAgentHost::kTypeFrame, false);
+    ReattachTargetsOfType(empty, DevToolsAgentHost::kTypeServiceWorker, false);
+    DCHECK(auto_attached_hosts_.empty());
+  }
+}
+
+void TargetAutoAttacher::SetAttachToFrames(bool attach_to_frames) {
+  if (attach_to_frames_ == attach_to_frames)
+    return;
+  attach_to_frames_ = attach_to_frames;
+  if (attach_to_frames_) {
+    UpdateFrames();
+  } else {
+    Hosts empty;
+    ReattachTargetsOfType(empty, DevToolsAgentHost::kTypeFrame, false);
+  }
+}
+
+// -------- ServiceWorkerDevToolsManager::Observer ----------
+
+void TargetAutoAttacher::WorkerCreated(ServiceWorkerDevToolsAgentHost* host) {
+  BrowserContext* browser_context = nullptr;
+  if (render_frame_host_)
+    browser_context = render_frame_host_->GetProcess()->GetBrowserContext();
+  auto hosts = GetMatchingServiceWorkers(browser_context, frame_urls_);
+  if (hosts.find(host->GetId()) != hosts.end() && !host->IsAttached() &&
+      !host->IsPausedForDebugOnStart() && wait_for_debugger_on_start_) {
+    host->PauseForDebugOnStart();
+  }
+}
+
+void TargetAutoAttacher::WorkerReadyForInspection(
+    ServiceWorkerDevToolsAgentHost* host) {
+  DCHECK(host->IsReadyForInspection());
+  if (ServiceWorkerDevToolsManager::GetInstance()
+          ->debug_service_worker_on_start()) {
+    // When debug_service_worker_on_start is true, a new DevTools window will
+    // be opened in ServiceWorkerDevToolsManager::WorkerReadyForInspection.
+    return;
+  }
+  ReattachServiceWorkers(host->IsPausedForDebugOnStart());
+}
+
+void TargetAutoAttacher::WorkerVersionInstalled(
+    ServiceWorkerDevToolsAgentHost* host) {
+  ReattachServiceWorkers(false);
+}
+
+void TargetAutoAttacher::WorkerVersionDoomed(
+    ServiceWorkerDevToolsAgentHost* host) {
+  ReattachServiceWorkers(false);
+}
+
+void TargetAutoAttacher::WorkerDestroyed(ServiceWorkerDevToolsAgentHost* host) {
+  ReattachServiceWorkers(false);
+}
+
+}  // namespace protocol
+}  // namespace content
diff --git a/content/browser/devtools/protocol/target_auto_attacher.h b/content/browser/devtools/protocol/target_auto_attacher.h
new file mode 100644
index 0000000..3262a65
--- /dev/null
+++ b/content/browser/devtools/protocol/target_auto_attacher.h
@@ -0,0 +1,68 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_BROWSER_DEVTOOLS_PROTOCOL_TARGET_AUTO_ATTACHER_H_
+#define CONTENT_BROWSER_DEVTOOLS_PROTOCOL_TARGET_AUTO_ATTACHER_H_
+
+#include "base/containers/flat_set.h"
+#include "content/browser/devtools/service_worker_devtools_manager.h"
+#include "content/public/browser/devtools_agent_host.h"
+
+namespace content {
+
+class RenderFrameHostImpl;
+
+namespace protocol {
+
+class TargetAutoAttacher : public ServiceWorkerDevToolsManager::Observer {
+ public:
+  // Second parameter is |waiting_for_debugger|, returns whether it succeeded.
+  using AttachCallback = base::Callback<bool(DevToolsAgentHost*, bool)>;
+  using DetachCallback = base::Callback<void(DevToolsAgentHost*)>;
+
+  TargetAutoAttacher(AttachCallback attach_callback,
+                     DetachCallback detach_callback);
+  ~TargetAutoAttacher() override;
+
+  void SetRenderFrameHost(RenderFrameHostImpl* host);
+  void SetAutoAttach(bool auto_attach, bool wait_for_debugger_on_start);
+  void SetAttachToFrames(bool attach_to_frames);
+
+  void UpdateServiceWorkers();
+  void UpdateFrames();
+  void AgentHostClosed(DevToolsAgentHost* host);
+
+ private:
+  using Hosts = base::flat_set<scoped_refptr<DevToolsAgentHost>>;
+
+  void ReattachServiceWorkers(bool waiting_for_debugger);
+  void ReattachTargetsOfType(const Hosts& new_hosts,
+                             const std::string& type,
+                             bool waiting_for_debugger);
+
+  // ServiceWorkerDevToolsManager::Observer implementation.
+  void WorkerCreated(ServiceWorkerDevToolsAgentHost* host) override;
+  void WorkerReadyForInspection(ServiceWorkerDevToolsAgentHost* host) override;
+  void WorkerVersionInstalled(ServiceWorkerDevToolsAgentHost* host) override;
+  void WorkerVersionDoomed(ServiceWorkerDevToolsAgentHost* host) override;
+  void WorkerDestroyed(ServiceWorkerDevToolsAgentHost* host) override;
+
+  AttachCallback attach_callback_;
+  DetachCallback detach_callback_;
+  RenderFrameHostImpl* render_frame_host_;
+  base::flat_set<GURL> frame_urls_;
+
+  bool auto_attach_;
+  bool wait_for_debugger_on_start_;
+  bool attach_to_frames_;
+
+  Hosts auto_attached_hosts_;
+
+  DISALLOW_COPY_AND_ASSIGN(TargetAutoAttacher);
+};
+
+}  // namespace protocol
+}  // namespace content
+
+#endif  // CONTENT_BROWSER_DEVTOOLS_PROTOCOL_TARGET_AUTO_ATTACHER_H_
diff --git a/content/browser/devtools/protocol/target_handler.cc b/content/browser/devtools/protocol/target_handler.cc
index 2cbdaffc..b117d129 100644
--- a/content/browser/devtools/protocol/target_handler.cc
+++ b/content/browser/devtools/protocol/target_handler.cc
@@ -6,83 +6,12 @@
 
 #include "content/browser/devtools/devtools_manager.h"
 #include "content/browser/devtools/devtools_session.h"
-#include "content/browser/devtools/render_frame_devtools_agent_host.h"
-#include "content/browser/devtools/service_worker_devtools_agent_host.h"
-#include "content/browser/frame_host/frame_tree.h"
-#include "content/browser/frame_host/frame_tree_node.h"
-#include "content/browser/frame_host/render_frame_host_impl.h"
 
 namespace content {
 namespace protocol {
 
 namespace {
 
-using ScopeAgentsMap =
-    std::map<GURL, std::unique_ptr<ServiceWorkerDevToolsAgentHost::List>>;
-
-void GetMatchingHostsByScopeMap(
-    const ServiceWorkerDevToolsAgentHost::List& agent_hosts,
-    const std::set<GURL>& urls,
-    ScopeAgentsMap* scope_agents_map) {
-  std::set<base::StringPiece> host_name_set;
-  for (const GURL& url : urls)
-    host_name_set.insert(url.host_piece());
-  for (const auto& host : agent_hosts) {
-    if (host_name_set.find(host->scope().host_piece()) == host_name_set.end())
-      continue;
-    const auto& it = scope_agents_map->find(host->scope());
-    if (it == scope_agents_map->end()) {
-      std::unique_ptr<ServiceWorkerDevToolsAgentHost::List> new_list(
-          new ServiceWorkerDevToolsAgentHost::List());
-      new_list->push_back(host);
-      (*scope_agents_map)[host->scope()] = std::move(new_list);
-    } else {
-      it->second->push_back(host);
-    }
-  }
-}
-
-void AddEligibleHosts(const ServiceWorkerDevToolsAgentHost::List& list,
-                      ServiceWorkerDevToolsAgentHost::Map* result) {
-  base::Time last_installed_time;
-  base::Time last_doomed_time;
-  for (const auto& host : list) {
-    if (host->version_installed_time() > last_installed_time)
-      last_installed_time = host->version_installed_time();
-    if (host->version_doomed_time() > last_doomed_time)
-      last_doomed_time = host->version_doomed_time();
-  }
-  for (const auto& host : list) {
-    // We don't attech old redundant Service Workers when there is newer
-    // installed Service Worker.
-    if (host->version_doomed_time().is_null() ||
-        (last_installed_time < last_doomed_time &&
-         last_doomed_time == host->version_doomed_time())) {
-      (*result)[host->GetId()] = host;
-    }
-  }
-}
-
-ServiceWorkerDevToolsAgentHost::Map GetMatchingServiceWorkers(
-    BrowserContext* browser_context,
-    const std::set<GURL>& urls) {
-  ServiceWorkerDevToolsAgentHost::Map result;
-  if (!browser_context)
-    return result;
-
-  ServiceWorkerDevToolsAgentHost::List agent_hosts;
-  ServiceWorkerDevToolsManager::GetInstance()
-      ->AddAllAgentHostsForBrowserContext(browser_context, &agent_hosts);
-
-  ScopeAgentsMap scope_agents_map;
-  GetMatchingHostsByScopeMap(agent_hosts, urls, &scope_agents_map);
-
-  for (const auto& it : scope_agents_map)
-    AddEligibleHosts(*it.second.get(), &result);
-
-  return result;
-}
-
 std::unique_ptr<Target::TargetInfo> CreateInfo(DevToolsAgentHost* host) {
   return Target::TargetInfo::Create()
       .SetTargetId(host->GetId())
@@ -97,12 +26,11 @@
 
 TargetHandler::TargetHandler()
     : DevToolsDomainHandler(Target::Metainfo::domainName),
-      discover_(false),
-      auto_attach_(false),
-      wait_for_debugger_on_start_(false),
-      attach_to_frames_(false),
-      render_frame_host_(nullptr) {
-}
+      auto_attacher_(base::Bind(&TargetHandler::AttachToTargetInternal,
+                                base::Unretained(this)),
+                     base::Bind(&TargetHandler::DetachFromTargetInternal,
+                                base::Unretained(this))),
+      discover_(false) {}
 
 TargetHandler::~TargetHandler() {
 }
@@ -120,8 +48,7 @@
 }
 
 void TargetHandler::SetRenderFrameHost(RenderFrameHostImpl* render_frame_host) {
-  render_frame_host_ = render_frame_host;
-  UpdateFrames();
+  auto_attacher_.SetRenderFrameHost(render_frame_host);
 }
 
 Response TargetHandler::Disable() {
@@ -133,78 +60,12 @@
   return Response::OK();
 }
 
-void TargetHandler::UpdateServiceWorkers() {
-  UpdateServiceWorkers(false);
+void TargetHandler::DidCommitNavigation() {
+  auto_attacher_.UpdateServiceWorkers();
 }
 
-void TargetHandler::UpdateFrames() {
-  if (!auto_attach_ || !attach_to_frames_)
-    return;
-
-  HostsMap new_hosts;
-  if (render_frame_host_) {
-    FrameTreeNode* root = render_frame_host_->frame_tree_node();
-    std::queue<FrameTreeNode*> queue;
-    queue.push(root);
-    while (!queue.empty()) {
-      FrameTreeNode* node = queue.front();
-      queue.pop();
-      bool cross_process = node->current_frame_host()->IsCrossProcessSubframe();
-      if (node != root && cross_process) {
-        scoped_refptr<DevToolsAgentHost> new_host =
-            RenderFrameDevToolsAgentHost::GetOrCreateFor(node);
-        new_hosts[new_host->GetId()] = new_host;
-      } else {
-        for (size_t i = 0; i < node->child_count(); ++i)
-          queue.push(node->child_at(i));
-      }
-    }
-  }
-
-  // TODO(dgozman): support wait_for_debugger_on_start_.
-  ReattachTargetsOfType(new_hosts, DevToolsAgentHost::kTypeFrame, false);
-}
-
-void TargetHandler::UpdateServiceWorkers(bool waiting_for_debugger) {
-  if (!auto_attach_)
-    return;
-
-  frame_urls_.clear();
-  BrowserContext* browser_context = nullptr;
-  if (render_frame_host_) {
-    // TODO(dgozman): do not traverse inside cross-process subframes.
-    for (FrameTreeNode* node :
-         render_frame_host_->frame_tree_node()->frame_tree()->Nodes()) {
-      frame_urls_.insert(node->current_url());
-    }
-    browser_context = render_frame_host_->GetProcess()->GetBrowserContext();
-  }
-
-  auto matching = GetMatchingServiceWorkers(browser_context, frame_urls_);
-  HostsMap new_hosts;
-  for (const auto& pair : matching) {
-    if (pair.second->IsReadyForInspection())
-      new_hosts[pair.first] = pair.second;
-  }
-  ReattachTargetsOfType(
-      new_hosts, DevToolsAgentHost::kTypeServiceWorker, waiting_for_debugger);
-}
-
-void TargetHandler::ReattachTargetsOfType(
-    const HostsMap& new_hosts,
-    const std::string& type,
-    bool waiting_for_debugger) {
-  HostsMap old_hosts = attached_hosts_;
-  for (const auto& pair : old_hosts) {
-    if (pair.second->GetType() == type &&
-        new_hosts.find(pair.first) == new_hosts.end()) {
-      DetachFromTargetInternal(pair.second.get());
-    }
-  }
-  for (const auto& pair : new_hosts) {
-    if (old_hosts.find(pair.first) == old_hosts.end())
-      AttachToTargetInternal(pair.second.get(), waiting_for_debugger);
-  }
+void TargetHandler::RenderFrameHostChanged() {
+  auto_attacher_.UpdateFrames();
 }
 
 void TargetHandler::TargetCreatedInternal(DevToolsAgentHost* host) {
@@ -268,33 +129,12 @@
 
 Response TargetHandler::SetAutoAttach(
     bool auto_attach, bool wait_for_debugger_on_start) {
-  wait_for_debugger_on_start_ = wait_for_debugger_on_start;
-  if (auto_attach_ == auto_attach)
-    return Response::FallThrough();
-  auto_attach_ = auto_attach;
-  if (auto_attach_) {
-    ServiceWorkerDevToolsManager::GetInstance()->AddObserver(this);
-    UpdateServiceWorkers();
-    UpdateFrames();
-  } else {
-    ServiceWorkerDevToolsManager::GetInstance()->RemoveObserver(this);
-    HostsMap empty;
-    ReattachTargetsOfType(empty, DevToolsAgentHost::kTypeFrame, false);
-    ReattachTargetsOfType(empty, DevToolsAgentHost::kTypeServiceWorker, false);
-  }
+  auto_attacher_.SetAutoAttach(auto_attach, wait_for_debugger_on_start);
   return Response::FallThrough();
 }
 
 Response TargetHandler::SetAttachToFrames(bool value) {
-  if (attach_to_frames_ == value)
-    return Response::OK();
-  attach_to_frames_ = value;
-  if (attach_to_frames_) {
-    UpdateFrames();
-  } else {
-    HostsMap empty;
-    ReattachTargetsOfType(empty, DevToolsAgentHost::kTypeFrame, false);
-  }
+  auto_attacher_.SetAttachToFrames(value);
   return Response::OK();
 }
 
@@ -416,6 +256,7 @@
     bool replaced_with_another_client) {
   frontend_->DetachedFromTarget(host->GetId());
   attached_hosts_.erase(host->GetId());
+  auto_attacher_.AgentHostClosed(host);
 }
 
 // -------------- DevToolsAgentHostObserver -----------------
@@ -443,46 +284,5 @@
   TargetInfoChangedInternal(host);
 }
 
-// -------- ServiceWorkerDevToolsManager::Observer ----------
-
-void TargetHandler::WorkerCreated(
-    ServiceWorkerDevToolsAgentHost* host) {
-  BrowserContext* browser_context = nullptr;
-  if (render_frame_host_)
-    browser_context = render_frame_host_->GetProcess()->GetBrowserContext();
-  auto hosts = GetMatchingServiceWorkers(browser_context, frame_urls_);
-  if (hosts.find(host->GetId()) != hosts.end() && !host->IsAttached() &&
-      !host->IsPausedForDebugOnStart() && wait_for_debugger_on_start_) {
-    host->PauseForDebugOnStart();
-  }
-}
-
-void TargetHandler::WorkerReadyForInspection(
-    ServiceWorkerDevToolsAgentHost* host) {
-  DCHECK(host->IsReadyForInspection());
-  if (ServiceWorkerDevToolsManager::GetInstance()
-          ->debug_service_worker_on_start()) {
-    // When debug_service_worker_on_start is true, a new DevTools window will
-    // be opened in ServiceWorkerDevToolsManager::WorkerReadyForInspection.
-    return;
-  }
-  UpdateServiceWorkers(host->IsPausedForDebugOnStart());
-}
-
-void TargetHandler::WorkerVersionInstalled(
-    ServiceWorkerDevToolsAgentHost* host) {
-  UpdateServiceWorkers();
-}
-
-void TargetHandler::WorkerVersionDoomed(
-    ServiceWorkerDevToolsAgentHost* host) {
-  UpdateServiceWorkers();
-}
-
-void TargetHandler::WorkerDestroyed(
-    ServiceWorkerDevToolsAgentHost* host) {
-  UpdateServiceWorkers();
-}
-
 }  // namespace protocol
 }  // namespace content
diff --git a/content/browser/devtools/protocol/target_handler.h b/content/browser/devtools/protocol/target_handler.h
index e932461..32b1ddf 100644
--- a/content/browser/devtools/protocol/target_handler.h
+++ b/content/browser/devtools/protocol/target_handler.h
@@ -10,7 +10,7 @@
 
 #include "content/browser/devtools/protocol/devtools_domain_handler.h"
 #include "content/browser/devtools/protocol/target.h"
-#include "content/browser/devtools/service_worker_devtools_manager.h"
+#include "content/browser/devtools/protocol/target_auto_attacher.h"
 #include "content/public/browser/devtools_agent_host_client.h"
 #include "content/public/browser/devtools_agent_host_observer.h"
 
@@ -24,7 +24,6 @@
 class TargetHandler : public DevToolsDomainHandler,
                       public Target::Backend,
                       public DevToolsAgentHostClient,
-                      public ServiceWorkerDevToolsManager::Observer,
                       public DevToolsAgentHostObserver {
  public:
   TargetHandler();
@@ -36,8 +35,8 @@
   void SetRenderFrameHost(RenderFrameHostImpl* host) override;
   Response Disable() override;
 
-  void UpdateServiceWorkers();
-  void UpdateFrames();
+  void DidCommitNavigation();
+  void RenderFrameHostChanged();
 
   // Domain implementation.
   Response SetDiscoverTargets(bool discover) override;
@@ -70,13 +69,8 @@
       override;
 
  private:
-  using HostsMap = std::map<std::string, scoped_refptr<DevToolsAgentHost>>;
   using RawHostsMap = std::map<std::string, DevToolsAgentHost*>;
 
-  void UpdateServiceWorkers(bool waiting_for_debugger);
-  void ReattachTargetsOfType(const HostsMap& new_hosts,
-                             const std::string& type,
-                             bool waiting_for_debugger);
   void TargetCreatedInternal(DevToolsAgentHost* host);
   void TargetInfoChangedInternal(DevToolsAgentHost* host);
   void TargetDestroyedInternal(DevToolsAgentHost* host);
@@ -84,13 +78,6 @@
                               bool waiting_for_debugger);
   void DetachFromTargetInternal(DevToolsAgentHost* host);
 
-  // ServiceWorkerDevToolsManager::Observer implementation.
-  void WorkerCreated(ServiceWorkerDevToolsAgentHost* host) override;
-  void WorkerReadyForInspection(ServiceWorkerDevToolsAgentHost* host) override;
-  void WorkerVersionInstalled(ServiceWorkerDevToolsAgentHost* host) override;
-  void WorkerVersionDoomed(ServiceWorkerDevToolsAgentHost* host) override;
-  void WorkerDestroyed(ServiceWorkerDevToolsAgentHost* host) override;
-
   // DevToolsAgentHostObserver implementation.
   bool ShouldForceDevToolsAgentHostCreation() override;
   void DevToolsAgentHostCreated(DevToolsAgentHost* agent_host) override;
@@ -105,13 +92,9 @@
                        bool replaced_with_another_client) override;
 
   std::unique_ptr<Target::Frontend> frontend_;
+  TargetAutoAttacher auto_attacher_;
   bool discover_;
-  bool auto_attach_;
-  bool wait_for_debugger_on_start_;
-  bool attach_to_frames_;
-  RenderFrameHostImpl* render_frame_host_;
-  HostsMap attached_hosts_;
-  std::set<GURL> frame_urls_;
+  std::map<std::string, scoped_refptr<DevToolsAgentHost>> attached_hosts_;
   RawHostsMap reported_hosts_;
 
   DISALLOW_COPY_AND_ASSIGN(TargetHandler);
diff --git a/content/browser/devtools/render_frame_devtools_agent_host.cc b/content/browser/devtools/render_frame_devtools_agent_host.cc
index d7e33429..6dae761 100644
--- a/content/browser/devtools/render_frame_devtools_agent_host.cc
+++ b/content/browser/devtools/render_frame_devtools_agent_host.cc
@@ -647,7 +647,7 @@
         CommitPending();
       }
       for (auto* target : protocol::TargetHandler::ForAgentHost(this))
-        target->UpdateServiceWorkers();
+        target->DidCommitNavigation();
     } else if (pending_ && pending_->host()->GetFrameTreeNodeId() ==
                                navigation_handle->GetFrameTreeNodeId()) {
       DiscardPending();
@@ -685,7 +685,7 @@
   }
   if (handle->HasCommitted()) {
     for (auto* target : protocol::TargetHandler::ForAgentHost(this))
-      target->UpdateServiceWorkers();
+      target->DidCommitNavigation();
   }
 }
 
@@ -819,7 +819,7 @@
     RenderFrameHost* old_host,
     RenderFrameHost* new_host) {
   for (auto* target : protocol::TargetHandler::ForAgentHost(this))
-    target->UpdateFrames();
+    target->RenderFrameHostChanged();
 
   if (IsBrowserSideNavigationEnabled()) {
     if (old_host != frame_host_)
diff --git a/content/browser/frame_host/cross_process_frame_connector.cc b/content/browser/frame_host/cross_process_frame_connector.cc
index 45ae834..261efa0 100644
--- a/content/browser/frame_host/cross_process_frame_connector.cc
+++ b/content/browser/frame_host/cross_process_frame_connector.cc
@@ -4,15 +4,16 @@
 
 #include "content/browser/frame_host/cross_process_frame_connector.h"
 
-#include "cc/surfaces/frame_sink_manager.h"
 #include "cc/surfaces/surface.h"
 #include "cc/surfaces/surface_hittest.h"
+#include "components/viz/service/frame_sinks/frame_sink_manager.h"
 #include "content/browser/compositor/surface_utils.h"
 #include "content/browser/frame_host/frame_tree.h"
 #include "content/browser/frame_host/frame_tree_node.h"
 #include "content/browser/frame_host/render_frame_host_manager.h"
 #include "content/browser/frame_host/render_frame_proxy_host.h"
 #include "content/browser/frame_host/render_widget_host_view_child_frame.h"
+#include "content/browser/renderer_host/cursor_manager.h"
 #include "content/browser/renderer_host/render_view_host_impl.h"
 #include "content/browser/renderer_host/render_widget_host_delegate.h"
 #include "content/browser/renderer_host/render_widget_host_impl.h"
@@ -57,6 +58,10 @@
     RenderWidgetHostViewChildFrame* view) {
   // Detach ourselves from the previous |view_|.
   if (view_) {
+    RenderWidgetHostViewBase* root_view = GetRootRenderWidgetHostView();
+    if (root_view && root_view->GetCursorManager())
+      root_view->GetCursorManager()->ViewBeingDestroyed(view_);
+
     // The RenderWidgetHostDelegate needs to be checked because set_view() can
     // be called during nested WebContents destruction. See
     // https://crbug.com/644306.
@@ -112,8 +117,10 @@
 
 void CrossProcessFrameConnector::UpdateCursor(const WebCursor& cursor) {
   RenderWidgetHostViewBase* root_view = GetRootRenderWidgetHostView();
-  if (root_view)
-    root_view->UpdateCursor(cursor);
+  // UpdateCursor messages are ignored if the root view does not support
+  // cursors.
+  if (root_view && root_view->GetCursorManager())
+    root_view->GetCursorManager()->UpdateCursor(view_, cursor);
 }
 
 gfx::Point CrossProcessFrameConnector::TransformPointToRootCoordSpace(
diff --git a/content/browser/frame_host/render_widget_host_view_child_frame.cc b/content/browser/frame_host/render_widget_host_view_child_frame.cc
index aa998182..14858aa 100644
--- a/content/browser/frame_host/render_widget_host_view_child_frame.cc
+++ b/content/browser/frame_host/render_widget_host_view_child_frame.cc
@@ -15,11 +15,11 @@
 #include "build/build_config.h"
 #include "cc/output/copy_output_request.h"
 #include "cc/output/copy_output_result.h"
-#include "cc/surfaces/frame_sink_manager.h"
 #include "cc/surfaces/surface.h"
 #include "cc/surfaces/surface_manager.h"
 #include "components/viz/host/host_frame_sink_manager.h"
 #include "components/viz/service/frame_sinks/compositor_frame_sink_support.h"
+#include "components/viz/service/frame_sinks/frame_sink_manager.h"
 #include "content/browser/accessibility/browser_accessibility_manager.h"
 #include "content/browser/browser_plugin/browser_plugin_guest.h"
 #include "content/browser/compositor/surface_utils.h"
diff --git a/content/browser/indexed_db/indexed_db_dispatcher_host_unittest.cc b/content/browser/indexed_db/indexed_db_dispatcher_host_unittest.cc
index 736e8dc..50d4856 100644
--- a/content/browser/indexed_db/indexed_db_dispatcher_host_unittest.cc
+++ b/content/browser/indexed_db/indexed_db_dispatcher_host_unittest.cc
@@ -508,7 +508,9 @@
   EXPECT_EQ(::indexed_db::mojom::Status::OK, callback_result);
 }
 
-TEST_F(IndexedDBDispatcherHostTest, CompactDatabaseWhileDoingTransaction) {
+// Flaky: crbug.com/742503
+TEST_F(IndexedDBDispatcherHostTest,
+       DISABLED_CompactDatabaseWhileDoingTransaction) {
   const int64_t kDBVersion = 1;
   const int64_t kTransactionId = 1;
   const int64_t kObjectStoreId = 10;
@@ -573,7 +575,8 @@
   EXPECT_EQ(::indexed_db::mojom::Status::OK, callback_result);
 }
 
-TEST_F(IndexedDBDispatcherHostTest, CompactDatabaseWhileUpgrading) {
+// Flaky: crbug.com/742503
+TEST_F(IndexedDBDispatcherHostTest, DISABLED_CompactDatabaseWhileUpgrading) {
   const int64_t kDBVersion = 1;
   const int64_t kTransactionId = 1;
 
@@ -693,7 +696,9 @@
   EXPECT_EQ(::indexed_db::mojom::Status::OK, callback_result);
 }
 
-TEST_F(IndexedDBDispatcherHostTest, AbortTransactionsWhileDoingTransaction) {
+// Flaky: crbug.com/742503
+TEST_F(IndexedDBDispatcherHostTest,
+       DISABLED_AbortTransactionsWhileDoingTransaction) {
   const int64_t kDBVersion = 1;
   const int64_t kTransactionId = 1;
   const int64_t kObjectStoreId = 10;
@@ -758,7 +763,8 @@
   EXPECT_EQ(::indexed_db::mojom::Status::OK, callback_result);
 }
 
-TEST_F(IndexedDBDispatcherHostTest, AbortTransactionsWhileUpgrading) {
+// Flaky: crbug.com/742503
+TEST_F(IndexedDBDispatcherHostTest, DISABLED_AbortTransactionsWhileUpgrading) {
   const int64_t kDBVersion = 1;
   const int64_t kTransactionId = 1;
 
diff --git a/content/browser/loader/DEPS b/content/browser/loader/DEPS
index 33ce038..28ae582 100644
--- a/content/browser/loader/DEPS
+++ b/content/browser/loader/DEPS
@@ -77,7 +77,6 @@
     "-content",
     "+content/browser/loader/mock_resource_loader.h",
     "+content/browser/loader/mojo_async_resource_handler.h",
-    "+content/browser/loader/test_url_loader_client.h",
     "+content/browser/loader/resource_controller.h",
     "+content/browser/loader/resource_dispatcher_host_impl.h",
     "+content/browser/loader/resource_request_info_impl.h",
@@ -97,6 +96,7 @@
     "+content/public/common/url_loader_factory.mojom.h",
     "+content/public/test/test_browser_context.h",
     "+content/public/test/test_browser_thread_bundle.h",
+    "+content/public/test/test_url_loader_client.h",
   ],
   "netlog_observer\.(cc|h)": [
     "-content",
@@ -301,14 +301,6 @@
     # TODO: To be replaced by mojo.
     "+content/common/resource_messages.h",
   ],
-  "test_url_loader_client\.(cc|h)": [
-    "-content",
-    "+content/browser/loader/test_url_loader_client.h",
-    "+content/public/common/resource_request_completion_status.h",
-    "+content/public/common/resource_response.h",
-    "+content/public/common/url_loader.mojom.h",
-    "+content/public/common/url_loader_factory.mojom.h",
-  ],
   "upload_progress_tracker\.(cc|h)": [
     "-content",
     "+content/browser/loader/upload_progress_tracker.h",
@@ -328,7 +320,6 @@
     "-content",
     "+content/browser/child_process_security_policy_impl.h",
     "+content/browser/loader/mojo_async_resource_handler.h",
-    "+content/browser/loader/test_url_loader_client.h",
     "+content/browser/loader/resource_dispatcher_host_impl.h",
     "+content/browser/loader/resource_message_filter.h",
     "+content/browser/loader/resource_request_info_impl.h",
@@ -343,6 +334,7 @@
     "+content/public/common/url_loader_factory.mojom.h",
     "+content/public/test/test_browser_context.h",
     "+content/public/test/test_browser_thread_bundle.h",
+    "+content/public/test/test_url_loader_client.h",
 
     #TODO: To be removed when PlzNavigate lands.
     "+content/browser/loader/navigation_resource_throttle.h"
diff --git a/content/browser/loader/mojo_async_resource_handler_unittest.cc b/content/browser/loader/mojo_async_resource_handler_unittest.cc
index c05fe38..d6bf4cba 100644
--- a/content/browser/loader/mojo_async_resource_handler_unittest.cc
+++ b/content/browser/loader/mojo_async_resource_handler_unittest.cc
@@ -23,7 +23,6 @@
 #include "content/browser/loader/resource_dispatcher_host_impl.h"
 #include "content/browser/loader/resource_request_info_impl.h"
 #include "content/browser/loader/resource_scheduler.h"
-#include "content/browser/loader/test_url_loader_client.h"
 #include "content/public/browser/appcache_service.h"
 #include "content/public/browser/navigation_data.h"
 #include "content/public/browser/resource_context.h"
@@ -38,6 +37,7 @@
 #include "content/public/common/url_loader_factory.mojom.h"
 #include "content/public/test/test_browser_context.h"
 #include "content/public/test/test_browser_thread_bundle.h"
+#include "content/public/test/test_url_loader_client.h"
 #include "mojo/public/c/system/data_pipe.h"
 #include "mojo/public/c/system/types.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
diff --git a/content/browser/loader/url_loader_factory_impl_unittest.cc b/content/browser/loader/url_loader_factory_impl_unittest.cc
index ab9dd1fc..c477cf6 100644
--- a/content/browser/loader/url_loader_factory_impl_unittest.cc
+++ b/content/browser/loader/url_loader_factory_impl_unittest.cc
@@ -26,7 +26,6 @@
 #include "content/browser/loader/resource_dispatcher_host_impl.h"
 #include "content/browser/loader/resource_message_filter.h"
 #include "content/browser/loader/resource_request_info_impl.h"
-#include "content/browser/loader/test_url_loader_client.h"
 #include "content/browser/loader_delegate_impl.h"
 #include "content/public/browser/resource_context.h"
 #include "content/public/browser/resource_dispatcher_host_delegate.h"
@@ -37,6 +36,7 @@
 #include "content/public/common/url_loader_factory.mojom.h"
 #include "content/public/test/test_browser_context.h"
 #include "content/public/test/test_browser_thread_bundle.h"
+#include "content/public/test/test_url_loader_client.h"
 #include "mojo/public/c/system/data_pipe.h"
 #include "mojo/public/c/system/types.h"
 #include "mojo/public/cpp/bindings/binding.h"
diff --git a/content/browser/renderer_host/compositor_impl_android.cc b/content/browser/renderer_host/compositor_impl_android.cc
index 313c9e4..43a11663 100644
--- a/content/browser/renderer_host/compositor_impl_android.cc
+++ b/content/browser/renderer_host/compositor_impl_android.cc
@@ -432,7 +432,7 @@
 }
 
 // static
-cc::FrameSinkManager* CompositorImpl::GetFrameSinkManager() {
+viz::FrameSinkManager* CompositorImpl::GetFrameSinkManager() {
   return g_compositor_dependencies.Get()
       .frame_sink_manager_impl->frame_sink_manager();
 }
@@ -814,7 +814,7 @@
     // TODO(danakj): Populate gpu_capabilities_ for VulkanContextProvider.
   }
 
-  cc::FrameSinkManager* manager = GetFrameSinkManager();
+  viz::FrameSinkManager* manager = GetFrameSinkManager();
   auto* task_runner = base::ThreadTaskRunnerHandle::Get().get();
   auto scheduler = base::MakeUnique<viz::DisplayScheduler>(
       root_window_->GetBeginFrameSource(), task_runner,
diff --git a/content/browser/renderer_host/compositor_impl_android.h b/content/browser/renderer_host/compositor_impl_android.h
index f5fa6b9..98c6c16 100644
--- a/content/browser/renderer_host/compositor_impl_android.h
+++ b/content/browser/renderer_host/compositor_impl_android.h
@@ -33,8 +33,6 @@
 
 namespace cc {
 class AnimationHost;
-class FrameSinkId;
-class FrameSinkManager;
 class Layer;
 class LayerTreeHost;
 class OutputSurface;
@@ -43,6 +41,8 @@
 
 namespace viz {
 class Display;
+class FrameSinkId;
+class FrameSinkManager;
 class HostFrameSinkManager;
 }
 
@@ -64,7 +64,7 @@
 
   static bool IsInitialized();
 
-  static cc::FrameSinkManager* GetFrameSinkManager();
+  static viz::FrameSinkManager* GetFrameSinkManager();
   static viz::HostFrameSinkManager* GetHostFrameSinkManager();
   static viz::FrameSinkId AllocateFrameSinkId();
 
diff --git a/content/browser/renderer_host/cursor_manager.cc b/content/browser/renderer_host/cursor_manager.cc
new file mode 100644
index 0000000..e32ad8e
--- /dev/null
+++ b/content/browser/renderer_host/cursor_manager.cc
@@ -0,0 +1,53 @@
+// Copyright (c) 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "cursor_manager.h"
+
+#include "content/browser/renderer_host/render_widget_host_view_base.h"
+
+namespace content {
+
+CursorManager::CursorManager(RenderWidgetHostViewBase* root)
+    : view_under_cursor_(root), root_view_(root) {}
+
+CursorManager::~CursorManager() {}
+
+void CursorManager::UpdateCursor(RenderWidgetHostViewBase* view,
+                                 const WebCursor& cursor) {
+  cursor_map_[view] = cursor;
+  if (view == view_under_cursor_)
+    root_view_->DisplayCursor(cursor);
+}
+
+void CursorManager::UpdateViewUnderCursor(RenderWidgetHostViewBase* view) {
+  view_under_cursor_ = view;
+  WebCursor cursor;
+
+  // If no UpdateCursor has been received for this view, use an empty cursor.
+  auto it = cursor_map_.find(view);
+  if (it != cursor_map_.end())
+    cursor = it->second;
+
+  root_view_->DisplayCursor(cursor);
+}
+
+void CursorManager::ViewBeingDestroyed(RenderWidgetHostViewBase* view) {
+  cursor_map_.erase(view);
+
+  // If the view right under the mouse is going away, use the root's cursor
+  // until UpdateViewUnderCursor is called again.
+  if (view == view_under_cursor_ && view != root_view_)
+    UpdateViewUnderCursor(root_view_);
+}
+
+bool CursorManager::GetCursorForTesting(RenderWidgetHostViewBase* view,
+                                        WebCursor& cursor) {
+  if (cursor_map_.find(view) == cursor_map_.end())
+    return false;
+
+  cursor = cursor_map_[view];
+  return true;
+}
+
+}  // namespace content
\ No newline at end of file
diff --git a/content/browser/renderer_host/cursor_manager.h b/content/browser/renderer_host/cursor_manager.h
new file mode 100644
index 0000000..d1480279
--- /dev/null
+++ b/content/browser/renderer_host/cursor_manager.h
@@ -0,0 +1,59 @@
+// Copyright (c) 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_BROWSER_RENDERER_HOST_CURSOR_MANAGER_H_
+#define CONTENT_BROWSER_RENDERER_HOST_CURSOR_MANAGER_H_
+
+#include <map>
+
+#include "content/common/content_export.h"
+#include "content/common/cursors/webcursor.h"
+
+namespace content {
+
+class RenderWidgetHostViewBase;
+
+// CursorManager coordinates mouse cursors for multiple RenderWidgetHostViews
+// on a single page. It is owned by the top-level RenderWidgetHostView and
+// calls back to its DisplayCursor method when the cursor needs to change,
+// either because the mouse moved over a different view or because a cursor
+// update was received for the current view.
+class CONTENT_EXPORT CursorManager {
+ public:
+  CursorManager(RenderWidgetHostViewBase* root);
+  ~CursorManager();
+
+  // Called for any RenderWidgetHostView that received an UpdateCursor message
+  // from its renderer process.
+  void UpdateCursor(RenderWidgetHostViewBase*, const WebCursor&);
+
+  // Called when the mouse moves over a different RenderWidgetHostView.
+  void UpdateViewUnderCursor(RenderWidgetHostViewBase*);
+
+  // Notification of a RenderWidgetHostView being destroyed, so that its
+  // cursor map entry can be removed if it has one. If it is the current
+  // view_under_cursor_, then the root_view_'s cursor will be displayed.
+  void ViewBeingDestroyed(RenderWidgetHostViewBase*);
+
+  // Accessor for browser tests, enabling verification of the cursor_map_.
+  // Returns false if the provided View is not in the map, and outputs
+  // the cursor otherwise.
+  bool GetCursorForTesting(RenderWidgetHostViewBase*, WebCursor&);
+
+ private:
+  // Stores the last received cursor from each RenderWidgetHostView.
+  std::map<RenderWidgetHostViewBase*, WebCursor> cursor_map_;
+
+  // The view currently underneath the cursor, which corresponds to the cursor
+  // currently displayed.
+  RenderWidgetHostViewBase* view_under_cursor_;
+
+  // The root view is the target for DisplayCursor calls whenever the active
+  // cursor needs to change.
+  RenderWidgetHostViewBase* root_view_;
+};
+
+}  // namespace content
+
+#endif  // CONTENT_BROWSER_RENDERER_HOST_CURSOR_MANAGER_H_
\ No newline at end of file
diff --git a/content/browser/renderer_host/cursor_manager_unittest.cc b/content/browser/renderer_host/cursor_manager_unittest.cc
new file mode 100644
index 0000000..e522972
--- /dev/null
+++ b/content/browser/renderer_host/cursor_manager_unittest.cc
@@ -0,0 +1,212 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/renderer_host/cursor_manager.h"
+
+#include "base/test/scoped_task_environment.h"
+#include "build/build_config.h"
+#include "content/browser/renderer_host/render_widget_host_delegate.h"
+#include "content/browser/renderer_host/render_widget_host_impl.h"
+#include "content/browser/renderer_host/render_widget_host_view_base.h"
+#include "content/common/cursors/webcursor.h"
+#include "content/public/common/cursor_info.h"
+#include "content/public/test/mock_render_process_host.h"
+#include "content/public/test/test_browser_context.h"
+#include "content/test/test_render_view_host.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+// CursorManager is only instantiated on Aura and Mac.
+#if defined(USE_AURA) || defined(OS_MACOSX)
+
+namespace content {
+
+namespace {
+
+// TODO(kenrb): This mock is implemented in several unit test files, and
+// could be moved into a common header.
+class MockRenderWidgetHostDelegate : public RenderWidgetHostDelegate {
+ public:
+  MockRenderWidgetHostDelegate() {}
+  ~MockRenderWidgetHostDelegate() override {}
+
+ private:
+  // RenderWidgetHostDelegate:
+  void ExecuteEditCommand(
+      const std::string& command,
+      const base::Optional<base::string16>& value) override {}
+  void Cut() override {}
+  void Copy() override {}
+  void Paste() override {}
+  void SelectAll() override {}
+};
+
+class MockRenderWidgetHostViewForCursors : public TestRenderWidgetHostView {
+ public:
+  MockRenderWidgetHostViewForCursors(RenderWidgetHost* host, bool top_view)
+      : TestRenderWidgetHostView(host) {
+    if (top_view)
+      cursor_manager_.reset(new CursorManager(this));
+  }
+
+  void DisplayCursor(const WebCursor& cursor) override {
+    current_cursor_ = cursor;
+  }
+
+  CursorManager* GetCursorManager() override { return cursor_manager_.get(); }
+
+  WebCursor cursor() { return current_cursor_; }
+
+ private:
+  WebCursor current_cursor_;
+  std::unique_ptr<CursorManager> cursor_manager_;
+};
+
+class CursorManagerTest : public testing::Test {
+ public:
+  CursorManagerTest()
+      : scoped_task_environment_(
+            base::test::ScopedTaskEnvironment::MainThreadType::UI) {}
+
+  void SetUp() override {
+    browser_context_.reset(new TestBrowserContext);
+    process_host_.reset(new MockRenderProcessHost(browser_context_.get()));
+    widget_host_.reset(MakeNewWidgetHost());
+    top_view_ =
+        new MockRenderWidgetHostViewForCursors(widget_host_.get(), true);
+  }
+
+  RenderWidgetHostImpl* MakeNewWidgetHost() {
+    int32_t routing_id = process_host_->GetNextRoutingID();
+    return new RenderWidgetHostImpl(&delegate_, process_host_.get(), routing_id,
+                                    false);
+  }
+
+  void TearDown() override {
+    if (top_view_)
+      delete top_view_;
+
+    widget_host_.reset();
+    process_host_.reset();
+  }
+
+ protected:
+  base::test::ScopedTaskEnvironment scoped_task_environment_;
+
+  std::unique_ptr<BrowserContext> browser_context_;
+  std::unique_ptr<MockRenderProcessHost> process_host_;
+  std::unique_ptr<RenderWidgetHostImpl> widget_host_;
+
+  // Tests should set this to nullptr if they've already triggered its
+  // destruction.
+  MockRenderWidgetHostViewForCursors* top_view_;
+
+  MockRenderWidgetHostDelegate delegate_;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(CursorManagerTest);
+};
+
+}  // namespace
+
+// Verify basic CursorManager functionality when no OOPIFs are present.
+TEST_F(CursorManagerTest, CursorOnSingleView) {
+  // Simulate mouse over the top-level frame without an UpdateCursor message.
+  top_view_->GetCursorManager()->UpdateViewUnderCursor(top_view_);
+
+  // The view should be using the default cursor.
+  EXPECT_TRUE(top_view_->cursor().IsEqual(WebCursor()));
+
+  CursorInfo cursor_info(blink::WebCursorInfo::kTypeHand);
+  WebCursor cursor_hand;
+  cursor_hand.InitFromCursorInfo(cursor_info);
+
+  // Update the view with a non-default cursor.
+  top_view_->GetCursorManager()->UpdateCursor(top_view_, cursor_hand);
+
+  // Verify the RenderWidgetHostView now uses the correct cursor.
+  EXPECT_TRUE(top_view_->cursor().IsEqual(cursor_hand));
+}
+
+// Verify cursor interactions between a parent frame and an out-of-process
+// child frame.
+TEST_F(CursorManagerTest, CursorOverChildView) {
+  std::unique_ptr<RenderWidgetHostImpl> widget_host(MakeNewWidgetHost());
+  std::unique_ptr<MockRenderWidgetHostViewForCursors> child_view(
+      new MockRenderWidgetHostViewForCursors(widget_host.get(), false));
+
+  CursorInfo cursor_info(blink::WebCursorInfo::kTypeHand);
+  WebCursor cursor_hand;
+  cursor_hand.InitFromCursorInfo(cursor_info);
+
+  // Set the child frame's cursor to a hand. This should not propagate to the
+  // top-level view without the mouse moving over the child frame.
+  top_view_->GetCursorManager()->UpdateCursor(child_view.get(), cursor_hand);
+  EXPECT_FALSE(top_view_->cursor().IsEqual(cursor_hand));
+
+  // Now moving the mouse over the child frame should update the overall cursor.
+  top_view_->GetCursorManager()->UpdateViewUnderCursor(child_view.get());
+  EXPECT_TRUE(top_view_->cursor().IsEqual(cursor_hand));
+
+  // Destruction of the child view should restore the parent frame's cursor.
+  top_view_->GetCursorManager()->ViewBeingDestroyed(child_view.get());
+  EXPECT_FALSE(top_view_->cursor().IsEqual(cursor_hand));
+}
+
+// Verify interactions between two independent OOPIFs, including interleaving
+// cursor updates and mouse movements. This simulates potential race
+// conditions between cursor updates.
+TEST_F(CursorManagerTest, CursorOverMultipleChildViews) {
+  std::unique_ptr<RenderWidgetHostImpl> widget_host1(MakeNewWidgetHost());
+  std::unique_ptr<MockRenderWidgetHostViewForCursors> child_view1(
+      new MockRenderWidgetHostViewForCursors(widget_host1.get(), false));
+  std::unique_ptr<RenderWidgetHostImpl> widget_host2(MakeNewWidgetHost());
+  std::unique_ptr<MockRenderWidgetHostViewForCursors> child_view2(
+      new MockRenderWidgetHostViewForCursors(widget_host2.get(), false));
+
+  CursorInfo cursor_info_hand(blink::WebCursorInfo::kTypeHand);
+  WebCursor cursor_hand;
+  cursor_hand.InitFromCursorInfo(cursor_info_hand);
+
+  CursorInfo cursor_info_cross(blink::WebCursorInfo::kTypeCross);
+  WebCursor cursor_cross;
+  cursor_cross.InitFromCursorInfo(cursor_info_cross);
+
+  CursorInfo cursor_info_pointer(blink::WebCursorInfo::kTypePointer);
+  WebCursor cursor_pointer;
+  cursor_pointer.InitFromCursorInfo(cursor_info_pointer);
+
+  // Initialize each View to a different cursor.
+  top_view_->GetCursorManager()->UpdateCursor(top_view_, cursor_hand);
+  top_view_->GetCursorManager()->UpdateCursor(child_view1.get(), cursor_cross);
+  top_view_->GetCursorManager()->UpdateCursor(child_view2.get(),
+                                              cursor_pointer);
+  EXPECT_TRUE(top_view_->cursor().IsEqual(cursor_hand));
+
+  // Simulate moving the mouse between child views and receiving cursor updates.
+  top_view_->GetCursorManager()->UpdateViewUnderCursor(child_view1.get());
+  EXPECT_TRUE(top_view_->cursor().IsEqual(cursor_cross));
+  top_view_->GetCursorManager()->UpdateViewUnderCursor(child_view2.get());
+  EXPECT_TRUE(top_view_->cursor().IsEqual(cursor_pointer));
+
+  // Simulate cursor updates to both child views and the parent view. An
+  // update to child_view1 or the parent view should not change the current
+  // cursor because the mouse is over child_view2.
+  top_view_->GetCursorManager()->UpdateCursor(child_view1.get(), cursor_hand);
+  EXPECT_TRUE(top_view_->cursor().IsEqual(cursor_pointer));
+  top_view_->GetCursorManager()->UpdateCursor(child_view2.get(), cursor_cross);
+  EXPECT_TRUE(top_view_->cursor().IsEqual(cursor_cross));
+  top_view_->GetCursorManager()->UpdateCursor(top_view_, cursor_hand);
+  EXPECT_TRUE(top_view_->cursor().IsEqual(cursor_cross));
+
+  // Similarly, destroying child_view1 should have no effect on the cursor,
+  // but destroying child_view2 should change it.
+  top_view_->GetCursorManager()->ViewBeingDestroyed(child_view1.get());
+  EXPECT_TRUE(top_view_->cursor().IsEqual(cursor_cross));
+  top_view_->GetCursorManager()->ViewBeingDestroyed(child_view2.get());
+  EXPECT_TRUE(top_view_->cursor().IsEqual(cursor_hand));
+}
+
+}  // namespace content
+
+#endif  // defined(USE_AURA) || defined(OS_MACOSX)
\ No newline at end of file
diff --git a/content/browser/renderer_host/delegated_frame_host.cc b/content/browser/renderer_host/delegated_frame_host.cc
index b1b3b32..7805e3e 100644
--- a/content/browser/renderer_host/delegated_frame_host.cc
+++ b/content/browser/renderer_host/delegated_frame_host.cc
@@ -17,12 +17,12 @@
 #include "cc/output/compositor_frame.h"
 #include "cc/output/copy_output_request.h"
 #include "cc/resources/single_release_callback.h"
-#include "cc/surfaces/frame_sink_manager.h"
 #include "cc/surfaces/surface.h"
 #include "cc/surfaces/surface_hittest.h"
 #include "components/viz/common/gl_helper.h"
 #include "components/viz/common/quads/texture_mailbox.h"
 #include "components/viz/service/frame_sinks/compositor_frame_sink_support.h"
+#include "components/viz/service/frame_sinks/frame_sink_manager.h"
 #include "content/browser/compositor/surface_utils.h"
 #include "content/browser/gpu/compositor_util.h"
 #include "content/browser/renderer_host/compositor_resize_lock.h"
@@ -440,7 +440,7 @@
     EvictDelegatedFrame();
   } else {
     ImageTransportFactory* factory = ImageTransportFactory::GetInstance();
-    cc::FrameSinkManager* manager =
+    viz::FrameSinkManager* manager =
         factory->GetContextFactoryPrivate()->GetFrameSinkManager();
 
     frame.metadata.latency_info.insert(frame.metadata.latency_info.end(),
diff --git a/content/browser/renderer_host/offscreen_canvas_surface_impl.cc b/content/browser/renderer_host/offscreen_canvas_surface_impl.cc
index 7bef352..ffb9dfd 100644
--- a/content/browser/renderer_host/offscreen_canvas_surface_impl.cc
+++ b/content/browser/renderer_host/offscreen_canvas_surface_impl.cc
@@ -8,8 +8,8 @@
 #include <utility>
 
 #include "base/memory/ptr_util.h"
-#include "cc/surfaces/frame_sink_manager.h"
 #include "components/viz/host/host_frame_sink_manager.h"
+#include "components/viz/service/frame_sinks/frame_sink_manager.h"
 #include "content/browser/compositor/surface_utils.h"
 
 namespace content {
diff --git a/content/browser/renderer_host/render_widget_host_input_event_router.cc b/content/browser/renderer_host/render_widget_host_input_event_router.cc
index bb6b5ec..124d1f15 100644
--- a/content/browser/renderer_host/render_widget_host_input_event_router.cc
+++ b/content/browser/renderer_host/render_widget_host_input_event_router.cc
@@ -11,6 +11,7 @@
 #include "cc/surfaces/surface_manager.h"
 #include "content/browser/frame_host/render_widget_host_view_child_frame.h"
 #include "content/browser/frame_host/render_widget_host_view_guest.h"
+#include "content/browser/renderer_host/cursor_manager.h"
 #include "content/browser/renderer_host/render_widget_host_impl.h"
 #include "content/browser/renderer_host/render_widget_host_view_base.h"
 #include "content/common/frame_messages.h"
@@ -257,11 +258,15 @@
 
   // SendMouseEnterOrLeaveEvents is called with the original event
   // coordinates, which are transformed independently for each view that will
-  // receive an event.
+  // receive an event. Also, since the view under the mouse has changed,
+  // notify the CursorManager that it might need to change the cursor.
   if ((event->GetType() == blink::WebInputEvent::kMouseLeave ||
        event->GetType() == blink::WebInputEvent::kMouseMove) &&
-      target != last_mouse_move_target_)
+      target != last_mouse_move_target_) {
     SendMouseEnterOrLeaveEvents(event, target, root_view);
+    if (root_view->GetCursorManager())
+      root_view->GetCursorManager()->UpdateViewUnderCursor(target);
+  }
 
   event->SetPositionInWidget(transformed_point.x(), transformed_point.y());
   target->ProcessMouseEvent(*event, latency);
diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc
index 1b32526..46bd35b 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.cc
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -30,11 +30,11 @@
 #include "cc/output/copy_output_result.h"
 #include "cc/output/latency_info_swap_promise.h"
 #include "cc/resources/single_release_callback.h"
-#include "cc/surfaces/frame_sink_manager.h"
 #include "cc/surfaces/surface.h"
 #include "cc/surfaces/surface_hittest.h"
 #include "cc/trees/layer_tree_host.h"
 #include "components/viz/common/gl_helper.h"
+#include "components/viz/service/frame_sinks/frame_sink_manager.h"
 #include "content/browser/accessibility/browser_accessibility_manager_android.h"
 #include "content/browser/accessibility/web_contents_accessibility_android.h"
 #include "content/browser/android/composited_touch_handle_drawable.h"
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc
index 9e158628..131f2c1 100644
--- a/content/browser/renderer_host/render_widget_host_view_aura.cc
+++ b/content/browser/renderer_host/render_widget_host_view_aura.cc
@@ -31,6 +31,7 @@
 #include "content/browser/frame_host/frame_tree_node.h"
 #include "content/browser/frame_host/render_frame_host_impl.h"
 #include "content/browser/gpu/compositor_util.h"
+#include "content/browser/renderer_host/cursor_manager.h"
 #include "content/browser/renderer_host/delegated_frame_host_client_aura.h"
 #include "content/browser/renderer_host/dip_util.h"
 #include "content/browser/renderer_host/input/synthetic_gesture_target_aura.h"
@@ -412,6 +413,8 @@
   if (GetTextInputManager())
     GetTextInputManager()->AddObserver(this);
 
+  cursor_manager_.reset(new CursorManager(this));
+
   bool overscroll_enabled = base::CommandLine::ForCurrentProcess()->
       GetSwitchValueASCII(switches::kOverscrollHistoryNavigation) != "0";
   SetOverscrollControllerEnabled(overscroll_enabled);
@@ -782,6 +785,10 @@
 }
 
 void RenderWidgetHostViewAura::UpdateCursor(const WebCursor& cursor) {
+  GetCursorManager()->UpdateCursor(this, cursor);
+}
+
+void RenderWidgetHostViewAura::DisplayCursor(const WebCursor& cursor) {
   current_cursor_ = cursor;
   const display::Display display =
       display::Screen::GetScreen()->GetDisplayNearestWindow(window_);
@@ -789,6 +796,10 @@
   UpdateCursorIfOverSelf();
 }
 
+CursorManager* RenderWidgetHostViewAura::GetCursorManager() {
+  return cursor_manager_.get();
+}
+
 void RenderWidgetHostViewAura::SetIsLoading(bool is_loading) {
   is_loading_ = is_loading;
   UpdateCursorIfOverSelf();
@@ -1839,6 +1850,8 @@
   selection_controller_.reset();
   selection_controller_client_.reset();
 
+  GetCursorManager()->ViewBeingDestroyed(this);
+
   delegated_frame_host_.reset();
   window_observer_.reset();
   if (window_) {
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.h b/content/browser/renderer_host/render_widget_host_view_aura.h
index f76bdd6..52b280e 100644
--- a/content/browser/renderer_host/render_widget_host_view_aura.h
+++ b/content/browser/renderer_host/render_widget_host_view_aura.h
@@ -68,6 +68,7 @@
 class LegacyRenderWidgetHostHWND;
 #endif
 
+class CursorManager;
 class DelegatedFrameHost;
 class DelegatedFrameHostClient;
 class RenderFrameHostImpl;
@@ -126,6 +127,8 @@
   void InitAsFullscreen(RenderWidgetHostView* reference_host_view) override;
   void Focus() override;
   void UpdateCursor(const WebCursor& cursor) override;
+  void DisplayCursor(const WebCursor& cursor) override;
+  CursorManager* GetCursorManager() override;
   void SetIsLoading(bool is_loading) override;
   void RenderProcessGone(base::TerminationStatus status,
                          int error_code) override;
@@ -607,6 +610,8 @@
   viz::FrameSinkId frame_sink_id_;
   viz::LocalSurfaceId local_surface_id_;
 
+  std::unique_ptr<CursorManager> cursor_manager_;
+
   base::WeakPtrFactory<RenderWidgetHostViewAura> weak_ptr_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostViewAura);
diff --git a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
index 6a16d4e..75e336c 100644
--- a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
+++ b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
@@ -27,7 +27,6 @@
 #include "cc/output/compositor_frame.h"
 #include "cc/output/compositor_frame_metadata.h"
 #include "cc/output/copy_output_request.h"
-#include "cc/surfaces/frame_sink_manager.h"
 #include "cc/surfaces/surface.h"
 #include "cc/test/begin_frame_args_test.h"
 #include "cc/test/fake_external_begin_frame_source.h"
@@ -36,6 +35,7 @@
 #include "components/viz/common/surfaces/local_surface_id_allocator.h"
 #include "components/viz/service/display_embedder/server_shared_bitmap_manager.h"
 #include "components/viz/service/display_embedder/shared_bitmap_allocation_notifier_impl.h"
+#include "components/viz/service/frame_sinks/frame_sink_manager.h"
 #include "content/browser/browser_thread_impl.h"
 #include "content/browser/compositor/test/no_transport_image_transport_factory.h"
 #include "content/browser/frame_host/render_widget_host_view_guest.h"
diff --git a/content/browser/renderer_host/render_widget_host_view_base.cc b/content/browser/renderer_host/render_widget_host_view_base.cc
index 8bdc035..ebf64e9 100644
--- a/content/browser/renderer_host/render_widget_host_view_base.cc
+++ b/content/browser/renderer_host/render_widget_host_view_base.cc
@@ -320,6 +320,14 @@
   NOTIMPLEMENTED();
 }
 
+void RenderWidgetHostViewBase::DisplayCursor(const WebCursor& cursor) {
+  return;
+}
+
+CursorManager* RenderWidgetHostViewBase::GetCursorManager() {
+  return nullptr;
+}
+
 // static
 ScreenOrientationValues RenderWidgetHostViewBase::GetOrientationTypeForMobile(
     const display::Display& display) {
diff --git a/content/browser/renderer_host/render_widget_host_view_base.h b/content/browser/renderer_host/render_widget_host_view_base.h
index b4297aff..9a124eb 100644
--- a/content/browser/renderer_host/render_widget_host_view_base.h
+++ b/content/browser/renderer_host/render_widget_host_view_base.h
@@ -74,6 +74,7 @@
 
 class BrowserAccessibilityDelegate;
 class BrowserAccessibilityManager;
+class CursorManager;
 class RenderWidgetHostImpl;
 class RenderWidgetHostViewBaseObserver;
 class SyntheticGestureTarget;
@@ -364,9 +365,18 @@
   // helps to position the full screen widget on the correct monitor.
   virtual void InitAsFullscreen(RenderWidgetHostView* reference_host_view) = 0;
 
-  // Sets the cursor to the one associated with the specified cursor_type
+  // Sets the cursor for this view to the one associated with the specified
+  // cursor_type.
   virtual void UpdateCursor(const WebCursor& cursor) = 0;
 
+  // Changes the cursor that is displayed on screen. This may or may not match
+  // the current cursor's view which was set by UpdateCursor.
+  virtual void DisplayCursor(const WebCursor& cursor);
+
+  // Views that manage cursors for window return a CursorManager. Other views
+  // return nullptr.
+  virtual CursorManager* GetCursorManager();
+
   // Indicates whether the page has finished loading.
   virtual void SetIsLoading(bool is_loading) = 0;
 
diff --git a/content/browser/renderer_host/render_widget_host_view_mac.h b/content/browser/renderer_host/render_widget_host_view_mac.h
index 1c2431f..fe03c9a 100644
--- a/content/browser/renderer_host/render_widget_host_view_mac.h
+++ b/content/browser/renderer_host/render_widget_host_view_mac.h
@@ -41,6 +41,7 @@
 #include "ui/display/display_observer.h"
 
 namespace content {
+class CursorManager;
 class RenderWidgetHost;
 class RenderWidgetHostImpl;
 class RenderWidgetHostViewMac;
@@ -302,6 +303,8 @@
   void InitAsFullscreen(RenderWidgetHostView* reference_host_view) override;
   void Focus() override;
   void UpdateCursor(const WebCursor& cursor) override;
+  void DisplayCursor(const WebCursor& cursor) override;
+  CursorManager* GetCursorManager() override;
   void SetIsLoading(bool is_loading) override;
   void RenderProcessGone(base::TerminationStatus status,
                          int error_code) override;
@@ -588,6 +591,8 @@
   SkColor background_color_ = SK_ColorTRANSPARENT;
   SkColor last_frame_root_background_color_ = SK_ColorTRANSPARENT;
 
+  std::unique_ptr<CursorManager> cursor_manager_;
+
   // Factory used to safely scope delayed calls to ShutdownHost().
   base::WeakPtrFactory<RenderWidgetHostViewMac> weak_factory_;
 
diff --git a/content/browser/renderer_host/render_widget_host_view_mac.mm b/content/browser/renderer_host/render_widget_host_view_mac.mm
index 345343e..febff77c 100644
--- a/content/browser/renderer_host/render_widget_host_view_mac.mm
+++ b/content/browser/renderer_host/render_widget_host_view_mac.mm
@@ -42,6 +42,7 @@
 #include "content/browser/frame_host/frame_tree_node.h"
 #include "content/browser/frame_host/render_frame_host_impl.h"
 #include "content/browser/gpu/compositor_util.h"
+#include "content/browser/renderer_host/cursor_manager.h"
 #import "content/browser/renderer_host/input/synthetic_gesture_target_mac.h"
 #include "content/browser/renderer_host/input/web_input_event_builders_mac.h"
 #include "content/browser/renderer_host/render_view_host_impl.h"
@@ -479,6 +480,8 @@
     needs_begin_frames = !rvh->GetDelegate()->IsNeverVisible();
   }
 
+  cursor_manager_.reset(new CursorManager(this));
+
   if (GetTextInputManager())
     GetTextInputManager()->AddObserver(this);
 
@@ -881,10 +884,18 @@
 }
 
 void RenderWidgetHostViewMac::UpdateCursor(const WebCursor& cursor) {
+  GetCursorManager()->UpdateCursor(this, cursor);
+}
+
+void RenderWidgetHostViewMac::DisplayCursor(const WebCursor& cursor) {
   WebCursor web_cursor = cursor;
   [cocoa_view_ updateCursor:web_cursor.GetNativeCursor()];
 }
 
+CursorManager* RenderWidgetHostViewMac::GetCursorManager() {
+  return cursor_manager_.get();
+}
+
 void RenderWidgetHostViewMac::SetIsLoading(bool is_loading) {
   is_loading_ = is_loading;
   // If we ever decide to show the waiting cursor while the page is loading
diff --git a/content/browser/resources/appcache/appcache_internals.html b/content/browser/resources/appcache/appcache_internals.html
index 688c4c3..ba2b3c5 100644
--- a/content/browser/resources/appcache/appcache_internals.html
+++ b/content/browser/resources/appcache/appcache_internals.html
@@ -4,7 +4,7 @@
   found in the LICENSE file.
 -->
 <!DOCTYPE html>
-<html i18n-values="dir:textdirection;lang:language">
+<html dir="$i18n{textdirection}" lang="$i18n{language}">
   <head>
     <meta charset="utf-8">
     <title>AppCache</title>
@@ -12,7 +12,7 @@
     <link rel="stylesheet" href="chrome://resources/css/widgets.css">
     <link rel="stylesheet" href="appcache_internals.css">
   </head>
-  <body i18n-values=".style.fontFamily:fontfamily;.style.fontSize:fontsize">
+  <body style="font-family:$i18n{fontfamily};font-size:$i18n{fontsize}">
     <!-- templates -->
     <div style="display:none">
       <div id="appcache-list-template"
@@ -101,7 +101,5 @@
       <script src="appcache_internals.js"></script>
       <script src="chrome://resources/js/load_time_data.js"></script>
       <script src="chrome://resources/js/jstemplate_compiled.js"></script>
-      <script src="strings.js"></script>
-      <script src="chrome://resources/js/i18n_template.js"></script>
   </body>
 </html>
diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc
index ac68083..178d504 100644
--- a/content/browser/site_per_process_browsertest.cc
+++ b/content/browser/site_per_process_browsertest.cc
@@ -41,6 +41,7 @@
 #include "content/browser/frame_host/render_widget_host_view_child_frame.h"
 #include "content/browser/gpu/compositor_util.h"
 #include "content/browser/loader/resource_dispatcher_host_impl.h"
+#include "content/browser/renderer_host/cursor_manager.h"
 #include "content/browser/renderer_host/input/input_router.h"
 #include "content/browser/renderer_host/input/synthetic_tap_gesture.h"
 #include "content/browser/renderer_host/render_view_host_impl.h"
@@ -5550,9 +5551,16 @@
 
 // Verify that we receive a mouse cursor update message when we mouse over
 // a text field contained in an out-of-process iframe.
-// Fails under TSan.  http://crbug.com/545237
+#if defined(OS_ANDROID)
+// Android does not have mouse cursors.
+#define MAYBE_CursorUpdateReceivedFromCrossSiteIframe \
+  DISABLED_CursorUpdateReceivedFromCrossSiteIframe
+#else
+#define MAYBE_CursorUpdateReceivedFromCrossSiteIframe \
+  CursorUpdateReceivedCrossSiteIframe
+#endif
 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest,
-                       DISABLED_CursorUpdateFromReceivedFromCrossSiteIframe) {
+                       MAYBE_CursorUpdateReceivedFromCrossSiteIframe) {
   GURL main_url(embedded_test_server()->GetURL(
       "/frame_tree/page_with_positioned_frame.html"));
   EXPECT_TRUE(NavigateToURL(shell(), main_url));
@@ -5563,19 +5571,33 @@
   EXPECT_NE(shell()->web_contents()->GetSiteInstance(),
             child_node->current_frame_host()->GetSiteInstance());
 
+  WaitForChildFrameSurfaceReady(child_node->current_frame_host());
+
   scoped_refptr<CursorMessageFilter> filter = new CursorMessageFilter();
   child_node->current_frame_host()->GetProcess()->AddFilter(filter.get());
 
+  RenderWidgetHostViewBase* root_view = static_cast<RenderWidgetHostViewBase*>(
+      root->current_frame_host()->GetRenderWidgetHost()->GetView());
+  RenderWidgetHost* rwh_child =
+      root->child_at(0)->current_frame_host()->GetRenderWidgetHost();
+  RenderWidgetHostViewBase* child_view =
+      static_cast<RenderWidgetHostViewBase*>(rwh_child->GetView());
+
+  // This should only return nullptr on Android.
+  EXPECT_TRUE(root_view->GetCursorManager());
+
+  WebCursor cursor;
+  EXPECT_FALSE(
+      root_view->GetCursorManager()->GetCursorForTesting(root_view, cursor));
+  EXPECT_FALSE(
+      root_view->GetCursorManager()->GetCursorForTesting(child_view, cursor));
+
   // Send a MouseMove to the subframe. The frame contains text, and moving the
   // mouse over it should cause the renderer to send a mouse cursor update.
   blink::WebMouseEvent mouse_event(blink::WebInputEvent::kMouseMove,
                                    blink::WebInputEvent::kNoModifiers,
                                    blink::WebInputEvent::kTimeStampForTesting);
   mouse_event.SetPositionInWidget(60, 60);
-  RenderWidgetHost* rwh_child =
-      root->child_at(0)->current_frame_host()->GetRenderWidgetHost();
-  RenderWidgetHostViewBase* root_view = static_cast<RenderWidgetHostViewBase*>(
-      root->current_frame_host()->GetRenderWidgetHost()->GetView());
   web_contents()->GetInputEventRouter()->RouteMouseEvent(
       root_view, &mouse_event, ui::LatencyInfo());
 
@@ -5584,6 +5606,24 @@
   // does not return otherwise.
   filter->Wait();
   EXPECT_EQ(filter->last_set_cursor_routing_id(), rwh_child->GetRoutingID());
+
+  // Yield to ensure that the SetCursor message is processed by its real
+  // handler.
+  {
+    base::RunLoop loop;
+    base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                                  loop.QuitClosure());
+    loop.Run();
+  }
+
+  EXPECT_FALSE(
+      root_view->GetCursorManager()->GetCursorForTesting(root_view, cursor));
+  EXPECT_TRUE(
+      root_view->GetCursorManager()->GetCursorForTesting(child_view, cursor));
+  // Since this moused over a text box, this should not be the default cursor.
+  CursorInfo cursor_info;
+  cursor.GetCursorInfo(&cursor_info);
+  EXPECT_EQ(cursor_info.type, blink::WebCursorInfo::kTypeIBeam);
 }
 #endif
 
diff --git a/content/browser/storage_partition_impl.cc b/content/browser/storage_partition_impl.cc
index 2ad03f4..9b1e53ea 100644
--- a/content/browser/storage_partition_impl.cc
+++ b/content/browser/storage_partition_impl.cc
@@ -31,12 +31,11 @@
 #include "content/public/browser/dom_storage_context.h"
 #include "content/public/browser/indexed_db_context.h"
 #include "content/public/browser/local_storage_usage_info.h"
+#include "content/public/browser/network_service_instance.h"
 #include "content/public/browser/session_storage_usage_info.h"
 #include "content/public/common/content_client.h"
 #include "content/public/common/content_features.h"
 #include "content/public/common/content_switches.h"
-#include "content/public/common/service_manager_connection.h"
-#include "content/public/common/service_names.mojom.h"
 #include "net/base/completion_callback.h"
 #include "net/base/net_errors.h"
 #include "net/cookies/canonical_cookie.h"
@@ -532,20 +531,13 @@
       ChromeBlobStorageContext::GetFor(context);
 
   if (base::FeatureList::IsEnabled(features::kNetworkService)) {
-    static mojom::NetworkServicePtr* g_network_service =
-        new mojom::NetworkServicePtr;
-    if (!g_network_service->is_bound()) {
-      ServiceManagerConnection::GetForProcess()->GetConnector()->BindInterface(
-          mojom::kNetworkServiceName, g_network_service);
-    }
     mojom::NetworkContextParamsPtr context_params =
         mojom::NetworkContextParams::New();
     // TODO: fill this
     // context_params->cache_dir =
     // context_params->cookie_path =
-    (*g_network_service)
-        ->CreateNetworkContext(MakeRequest(&partition->network_context_),
-                               std::move(context_params));
+    GetNetworkService()->CreateNetworkContext(
+        MakeRequest(&partition->network_context_), std::move(context_params));
 
     BlobURLLoaderFactory::BlobContextGetter blob_getter =
         base::BindOnce(&BlobStorageContextGetter, blob_context);
diff --git a/content/network/BUILD.gn b/content/network/BUILD.gn
index 5eb1ad28..ffe4988a 100644
--- a/content/network/BUILD.gn
+++ b/content/network/BUILD.gn
@@ -24,6 +24,7 @@
     ":network",
     "//content",  # For the component build.
     "//content/app:*",
+    "//content/public/network/*",
     "//content/utility:utility",
   ]
 
@@ -32,8 +33,8 @@
     "cache_url_loader.h",
     "network_context.cc",
     "network_context.h",
-    "network_service.cc",
-    "network_service.h",
+    "network_service_impl.cc",
+    "network_service_impl.h",
     "network_service_url_loader_factory_impl.cc",
     "network_service_url_loader_factory_impl.h",
     "url_loader_impl.cc",
diff --git a/content/network/DEPS b/content/network/DEPS
index ac2ce4d..1105ee1e 100644
--- a/content/network/DEPS
+++ b/content/network/DEPS
@@ -14,12 +14,13 @@
   "+content/public/common/url_constants.h",
   "+content/public/common/url_loader.mojom.h",
   "+content/public/common/url_loader_factory.mojom.h",
+  "+content/public/network",
   "+services/service_manager/public",
 ]
 
 specific_include_rules = {
   '.*_[a-z]*test.*': [
-    "+content/browser/loader/test_url_loader_client.h",
     "+content/public/common/content_paths.h",
+    "+content/public/test/test_url_loader_client.h",
   ],
 }
diff --git a/content/network/network_context.cc b/content/network/network_context.cc
index ea81b5c..4dde5fda 100644
--- a/content/network/network_context.cc
+++ b/content/network/network_context.cc
@@ -9,7 +9,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "components/network_session_configurator/common/network_switches.h"
 #include "content/network/cache_url_loader.h"
-#include "content/network/network_service.h"
+#include "content/network/network_service_impl.h"
 #include "content/network/network_service_url_loader_factory_impl.h"
 #include "content/network/url_loader_impl.h"
 #include "content/public/common/content_client.h"
@@ -87,7 +87,7 @@
 
 }  // namespace
 
-NetworkContext::NetworkContext(NetworkService* network_service,
+NetworkContext::NetworkContext(NetworkServiceImpl* network_service,
                                mojom::NetworkContextRequest request,
                                mojom::NetworkContextParamsPtr params)
     : network_service_(network_service),
@@ -99,6 +99,18 @@
       base::Bind(&NetworkContext::OnConnectionError, base::Unretained(this)));
 }
 
+// TODO(mmenke): Share URLRequestContextBulder configuration between two
+// constructors. Can only share them once consumer code is ready for its
+// corresponding options to be overwritten.
+NetworkContext::NetworkContext(
+    mojom::NetworkContextRequest request,
+    mojom::NetworkContextParamsPtr params,
+    std::unique_ptr<net::URLRequestContextBuilder> builder)
+    : network_service_(nullptr),
+      url_request_context_(builder->Build()),
+      params_(std::move(params)),
+      binding_(this, std::move(request)) {}
+
 NetworkContext::~NetworkContext() {
   // Call each URLLoaderImpl and ask it to release its net::URLRequest, as the
   // corresponding net::URLRequestContext is going away with this
diff --git a/content/network/network_context.h b/content/network/network_context.h
index 278923f..c50fc033 100644
--- a/content/network/network_context.h
+++ b/content/network/network_context.h
@@ -19,17 +19,25 @@
 
 namespace net {
 class URLRequestContext;
+class URLRequestContextBuilder;
 }
 
 namespace content {
-class NetworkService;
+class NetworkServiceImpl;
 class URLLoaderImpl;
 
 class NetworkContext : public mojom::NetworkContext {
  public:
-  NetworkContext(NetworkService* network_service,
+  NetworkContext(NetworkServiceImpl* network_service,
                  mojom::NetworkContextRequest request,
                  mojom::NetworkContextParamsPtr params);
+
+  // Temporary constructor that allows creating an in-process NetworkContext
+  // with a pre-populated URLRequestContextBuilder.
+  NetworkContext(mojom::NetworkContextRequest request,
+                 mojom::NetworkContextParamsPtr params,
+                 std::unique_ptr<net::URLRequestContextBuilder> builder);
+
   ~NetworkContext() override;
 
   CONTENT_EXPORT static std::unique_ptr<NetworkContext> CreateForTesting();
@@ -49,7 +57,7 @@
   void HandleViewCacheRequest(const GURL& url,
                               mojom::URLLoaderClientPtr client) override;
 
-  // Called when the associated NetworkService is going away. Guaranteed to
+  // Called when the associated NetworkServiceImpl is going away. Guaranteed to
   // destroy NetworkContext's URLRequestContext.
   void Cleanup();
 
@@ -59,7 +67,7 @@
   // On connection errors the NetworkContext destroys itself.
   void OnConnectionError();
 
-  NetworkService* const network_service_;
+  NetworkServiceImpl* const network_service_;
 
   std::unique_ptr<net::URLRequestContext> url_request_context_;
 
diff --git a/content/network/network_service.cc b/content/network/network_service_impl.cc
similarity index 61%
rename from content/network/network_service.cc
rename to content/network/network_service_impl.cc
index a9a8845..d2b53be 100644
--- a/content/network/network_service.cc
+++ b/content/network/network_service_impl.cc
@@ -2,22 +2,28 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "content/network/network_service.h"
+#include "content/network/network_service_impl.h"
 
 #include "base/command_line.h"
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
 #include "base/values.h"
+#include "build/build_config.h"
 #include "content/network/network_context.h"
 #include "content/public/common/content_switches.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
 #include "net/log/file_net_log_observer.h"
 #include "net/log/net_log_util.h"
+#include "net/url_request/url_request_context_builder.h"
 #include "services/service_manager/public/cpp/bind_source_info.h"
 
 namespace content {
 
-class NetworkService::MojoNetLog : public net::NetLog {
+std::unique_ptr<NetworkService> NetworkService::Create() {
+  return base::MakeUnique<NetworkServiceImpl>(nullptr);
+}
+
+class NetworkServiceImpl::MojoNetLog : public net::NetLog {
  public:
   MojoNetLog() {
     const base::CommandLine* command_line =
@@ -46,17 +52,20 @@
   DISALLOW_COPY_AND_ASSIGN(MojoNetLog);
 };
 
-NetworkService::NetworkService(
+NetworkServiceImpl::NetworkServiceImpl(
     std::unique_ptr<service_manager::BinderRegistry> registry)
     : net_log_(new MojoNetLog), registry_(std::move(registry)), binding_(this) {
-  // |registry_| may be nullptr in tests.
+  // |registry_| is nullptr in tests and when an in-process NetworkService is
+  // created directly. The latter is done in concert with using
+  // CreateNetworkContextWithBuilder to ease the transition to using the network
+  // service.
   if (registry_) {
     registry_->AddInterface<mojom::NetworkService>(
-        base::Bind(&NetworkService::Create, base::Unretained(this)));
+        base::Bind(&NetworkServiceImpl::Create, base::Unretained(this)));
   }
 }
 
-NetworkService::~NetworkService() {
+NetworkServiceImpl::~NetworkServiceImpl() {
   // Call each Network and ask it to release its net::URLRequestContext, as they
   // may have references to shared objects owned by the NetworkService. The
   // NetworkContexts deregister themselves in Cleanup(), so have to be careful.
@@ -64,21 +73,36 @@
     (*network_contexts_.begin())->Cleanup();
 }
 
-std::unique_ptr<NetworkService> NetworkService::CreateForTesting() {
-  return base::WrapUnique(new NetworkService());
+std::unique_ptr<mojom::NetworkContext>
+NetworkServiceImpl::CreateNetworkContextWithBuilder(
+    content::mojom::NetworkContextRequest request,
+    content::mojom::NetworkContextParamsPtr params,
+    std::unique_ptr<net::URLRequestContextBuilder> builder,
+    net::URLRequestContext** url_request_context) {
+  std::unique_ptr<NetworkContext> network_context =
+      base::MakeUnique<NetworkContext>(std::move(request), std::move(params),
+                                       std::move(builder));
+  *url_request_context = network_context->url_request_context();
+  return network_context;
 }
 
-void NetworkService::RegisterNetworkContext(NetworkContext* network_context) {
+std::unique_ptr<NetworkService> NetworkServiceImpl::CreateForTesting() {
+  return base::WrapUnique(new NetworkServiceImpl(nullptr));
+}
+
+void NetworkServiceImpl::RegisterNetworkContext(
+    NetworkContext* network_context) {
   DCHECK_EQ(0u, network_contexts_.count(network_context));
   network_contexts_.insert(network_context);
 }
 
-void NetworkService::DeregisterNetworkContext(NetworkContext* network_context) {
+void NetworkServiceImpl::DeregisterNetworkContext(
+    NetworkContext* network_context) {
   DCHECK_EQ(1u, network_contexts_.count(network_context));
   network_contexts_.erase(network_context);
 }
 
-void NetworkService::CreateNetworkContext(
+void NetworkServiceImpl::CreateNetworkContext(
     mojom::NetworkContextRequest request,
     mojom::NetworkContextParamsPtr params) {
   // The NetworkContext will destroy itself on connection error, or when the
@@ -86,9 +110,7 @@
   new NetworkContext(this, std::move(request), std::move(params));
 }
 
-NetworkService::NetworkService() : NetworkService(nullptr) {}
-
-void NetworkService::OnBindInterface(
+void NetworkServiceImpl::OnBindInterface(
     const service_manager::BindSourceInfo& source_info,
     const std::string& interface_name,
     mojo::ScopedMessagePipeHandle interface_pipe) {
@@ -96,8 +118,9 @@
                            std::move(interface_pipe));
 }
 
-void NetworkService::Create(const service_manager::BindSourceInfo& source_info,
-                            mojom::NetworkServiceRequest request) {
+void NetworkServiceImpl::Create(
+    const service_manager::BindSourceInfo& source_info,
+    mojom::NetworkServiceRequest request) {
   DCHECK(!binding_.is_bound());
   binding_.Bind(std::move(request));
 }
diff --git a/content/network/network_service.h b/content/network/network_service_impl.h
similarity index 67%
rename from content/network/network_service.h
rename to content/network/network_service_impl.h
index 703ffc2..74e86910 100644
--- a/content/network/network_service.h
+++ b/content/network/network_service_impl.h
@@ -2,30 +2,43 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CONTENT_NETWORK_NETWORK_SERVICE_H_
-#define CONTENT_NETWORK_NETWORK_SERVICE_H_
+#ifndef CONTENT_NETWORK_NETWORK_SERVICE_IMPL_H_
+#define CONTENT_NETWORK_NETWORK_SERVICE_IMPL_H_
 
 #include <memory>
 
 #include "base/macros.h"
 #include "content/common/content_export.h"
 #include "content/public/common/network_service.mojom.h"
+#include "content/public/network/network_service.h"
 #include "mojo/public/cpp/bindings/binding.h"
 #include "services/service_manager/public/cpp/binder_registry.h"
 #include "services/service_manager/public/cpp/service.h"
 
+namespace net {
+class URLRequestContext;
+class URLRequestContextBuilder;
+}  // namespace net
+
 namespace content {
 
 class NetworkContext;
 
-class NetworkService : public service_manager::Service,
-                       public mojom::NetworkService {
+class CONTENT_EXPORT NetworkServiceImpl : public service_manager::Service,
+                                          public NetworkService {
  public:
-  explicit NetworkService(
+  explicit NetworkServiceImpl(
       std::unique_ptr<service_manager::BinderRegistry> registry);
-  ~NetworkService() override;
 
-  CONTENT_EXPORT static std::unique_ptr<NetworkService> CreateForTesting();
+  ~NetworkServiceImpl() override;
+
+  std::unique_ptr<mojom::NetworkContext> CreateNetworkContextWithBuilder(
+      content::mojom::NetworkContextRequest request,
+      content::mojom::NetworkContextParamsPtr params,
+      std::unique_ptr<net::URLRequestContextBuilder> builder,
+      net::URLRequestContext** url_request_context) override;
+
+  static std::unique_ptr<NetworkService> CreateForTesting();
 
   // These are called by NetworkContexts as they are being created and
   // destroyed.
@@ -39,9 +52,6 @@
  private:
   class MojoNetLog;
 
-  // Used for tests.
-  NetworkService();
-
   // service_manager::Service implementation.
   void OnBindInterface(const service_manager::BindSourceInfo& source_info,
                        const std::string& interface_name,
@@ -62,9 +72,9 @@
   // destroyed first.
   std::set<NetworkContext*> network_contexts_;
 
-  DISALLOW_COPY_AND_ASSIGN(NetworkService);
+  DISALLOW_COPY_AND_ASSIGN(NetworkServiceImpl);
 };
 
 }  // namespace content
 
-#endif  // CONTENT_NETWORK_NETWORK_SERVICE_H_
+#endif  // CONTENT_NETWORK_NETWORK_SERVICE_IMPL_H_
diff --git a/content/network/network_service_unittest.cc b/content/network/network_service_unittest.cc
index 29aa109..5a31c8e 100644
--- a/content/network/network_service_unittest.cc
+++ b/content/network/network_service_unittest.cc
@@ -8,7 +8,7 @@
 #include "base/test/scoped_task_environment.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "content/network/network_context.h"
-#include "content/network/network_service.h"
+#include "content/network/network_service_impl.h"
 #include "content/public/common/network_service.mojom.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -21,7 +21,7 @@
   NetworkServiceTest()
       : scoped_task_environment_(
             base::test::ScopedTaskEnvironment::MainThreadType::IO),
-        service_(NetworkService::CreateForTesting()) {}
+        service_(NetworkServiceImpl::CreateForTesting()) {}
   ~NetworkServiceTest() override {}
 
   NetworkService* service() const { return service_.get(); }
diff --git a/content/network/url_loader_unittest.cc b/content/network/url_loader_unittest.cc
index e9486c5..5af30a7e 100644
--- a/content/network/url_loader_unittest.cc
+++ b/content/network/url_loader_unittest.cc
@@ -7,10 +7,10 @@
 #include "base/run_loop.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/threading/thread_task_runner_handle.h"
-#include "content/browser/loader/test_url_loader_client.h"
 #include "content/network/network_context.h"
 #include "content/network/url_loader_impl.h"
 #include "content/public/common/content_paths.h"
+#include "content/public/test/test_url_loader_client.h"
 #include "mojo/public/c/system/data_pipe.h"
 #include "mojo/public/cpp/system/wait.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
diff --git a/content/public/browser/BUILD.gn b/content/public/browser/BUILD.gn
index df45385..2cf71897 100644
--- a/content/public/browser/BUILD.gn
+++ b/content/public/browser/BUILD.gn
@@ -169,6 +169,8 @@
     "navigation_type.h",
     "navigation_ui_data.h",
     "network_quality_observer_factory.h",
+    "network_service_instance.cc",
+    "network_service_instance.h",
     "notification_database_data.cc",
     "notification_database_data.h",
     "notification_details.h",
@@ -323,12 +325,12 @@
     "//net",
     "//ppapi/c",
     "//services/device/public/interfaces",
+    "//third_party/webrtc/modules/desktop_capture",
     "//ui/accessibility",
     "//ui/base",
     "//ui/events",
     "//ui/gl",
     "//ui/surface",
-    "//third_party/webrtc/modules/desktop_capture",
   ]
 
   allow_circular_includes_from = [
diff --git a/content/public/browser/network_service_instance.cc b/content/public/browser/network_service_instance.cc
new file mode 100644
index 0000000..5cf2970
--- /dev/null
+++ b/content/public/browser/network_service_instance.cc
@@ -0,0 +1,30 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/public/browser/network_service_instance.h"
+
+#include "base/feature_list.h"
+#include "content/public/browser/browser_thread.h"
+#include "content/public/common/content_features.h"
+#include "content/public/common/network_service.mojom.h"
+#include "content/public/common/service_manager_connection.h"
+#include "content/public/common/service_names.mojom.h"
+#include "services/service_manager/public/cpp/connector.h"
+
+namespace content {
+
+mojom::NetworkService* GetNetworkService() {
+  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+  DCHECK(base::FeatureList::IsEnabled(features::kNetworkService));
+
+  static mojom::NetworkServicePtr* g_network_service =
+      new mojom::NetworkServicePtr;
+  if (!g_network_service->is_bound()) {
+    ServiceManagerConnection::GetForProcess()->GetConnector()->BindInterface(
+        mojom::kNetworkServiceName, g_network_service);
+  }
+  return g_network_service->get();
+}
+
+}  // namespace content
diff --git a/content/public/browser/network_service_instance.h b/content/public/browser/network_service_instance.h
new file mode 100644
index 0000000..0de5b4d
--- /dev/null
+++ b/content/public/browser/network_service_instance.h
@@ -0,0 +1,23 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_PUBLIC_BROWSER_NETWORK_SERVICE_INSTANCE_H_
+#define CONTENT_PUBLIC_BROWSER_NETWORK_SERVICE_INSTANCE_H_
+
+#include "content/common/content_export.h"
+
+namespace content {
+
+namespace mojom {
+class NetworkService;
+}
+
+// Returns a pointer to the NetworkService, creating / re-creating it as needed.
+// Must only be called on the UI thread. Must not be called if the network
+// service is disabled.
+CONTENT_EXPORT mojom::NetworkService* GetNetworkService();
+
+}  // namespace content
+
+#endif  // CONTENT_PUBLIC_BROWSER_NETWORK_SERVICE_INSTANCE_H_
\ No newline at end of file
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
index 0b6d983..614e100 100644
--- a/content/public/common/content_features.cc
+++ b/content/public/common/content_features.cc
@@ -319,7 +319,7 @@
 
 // Enable WebAssembly streamed compilation.
 const base::Feature kWebAssemblyStreaming{"WebAssemblyStreaming",
-                                          base::FEATURE_DISABLED_BY_DEFAULT};
+                                          base::FEATURE_ENABLED_BY_DEFAULT};
 
 // Enable WebAssembly streamed compilation.
 const base::Feature kWebAssemblyTrapHandler{"WebAssemblyTrapHandler",
diff --git a/content/public/network/BUILD.gn b/content/public/network/BUILD.gn
new file mode 100644
index 0000000..3e44f5108
--- /dev/null
+++ b/content/public/network/BUILD.gn
@@ -0,0 +1,35 @@
+# Copyright 2017 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# See //content/BUILD.gn for how this works.
+group("network") {
+  if (is_component_build) {
+    public_deps = [
+      "//content",
+    ]
+  } else {
+    public_deps = [
+      ":network_sources",
+    ]
+  }
+}
+
+target("source_set", "network_sources") {
+  visibility = [ "//content/*" ]
+
+  configs += [ "//content:content_implementation" ]
+
+  sources = [
+    "network_service.h",
+  ]
+
+  deps = [
+    "//base",
+    "//content:export",
+    "//content/common:mojo_bindings",
+    "//content/network:network_sources",
+  ]
+
+  allow_circular_includes_from = [ "//content/network:network_sources" ]
+}
diff --git a/content/public/network/DEPS b/content/public/network/DEPS
new file mode 100644
index 0000000..31545d0
--- /dev/null
+++ b/content/public/network/DEPS
@@ -0,0 +1,5 @@
+specific_include_rules = {
+  ".*\.cc": [
+    "+content/network",
+  ],
+}
diff --git a/content/public/network/network_service.h b/content/public/network/network_service.h
new file mode 100644
index 0000000..a4bb4de
--- /dev/null
+++ b/content/public/network/network_service.h
@@ -0,0 +1,50 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_PUBLIC_NETWORK_NETWORK_SERVICE_H_
+#define CONTENT_PUBLIC_NETWORK_NETWORK_SERVICE_H_
+
+#include <memory>
+
+#include "content/common/content_export.h"
+#include "content/public/common/network_service.mojom.h"
+
+namespace net {
+class URLRequestContext;
+class URLRequestContextBuilder;
+}  // namespace net
+
+namespace content {
+
+// Allows an in-process NetworkService to be set up.
+class CONTENT_EXPORT NetworkService : public mojom::NetworkService {
+ public:
+  // TODO(mmenke): Take in a NetworkServiceRequest.
+  static std::unique_ptr<NetworkService> Create();
+
+  // Can be used to seed a NetworkContext with a consumer-configured
+  // URLRequestContextBuilder, which |params| will then be applied to. The
+  // results URLRequestContext will be written to |url_request_context|, which
+  // is owned by the NetworkContext, and can be further modified before first
+  // use. The returned NetworkContext must be destroyed before the
+  // NetworkService.
+  //
+  // This method is intended to ease the transition to an out-of-process
+  // NetworkService, and will be removed once that ships.
+  virtual std::unique_ptr<mojom::NetworkContext>
+  CreateNetworkContextWithBuilder(
+      content::mojom::NetworkContextRequest request,
+      content::mojom::NetworkContextParamsPtr params,
+      std::unique_ptr<net::URLRequestContextBuilder> builder,
+      net::URLRequestContext** url_request_context) = 0;
+
+  ~NetworkService() override {}
+
+ protected:
+  NetworkService() {}
+};
+
+}  // namespace content
+
+#endif  // CONTENT_PUBLIC_NETWORK_NETWORK_SERVICE_H_
diff --git a/content/public/test/DEPS b/content/public/test/DEPS
index 2d15ed00..e27d7fb 100644
--- a/content/public/test/DEPS
+++ b/content/public/test/DEPS
@@ -1,6 +1,7 @@
 include_rules = [
   "-content",
   "+content/public",
+  "+components/viz/service",
   "+device/geolocation/android/geolocation_jni_registrar.h",
   "+mojo/android/system/mojo_jni_registrar.h",
   "+services/service_manager",
diff --git a/content/public/test/browser_test_utils.cc b/content/public/test/browser_test_utils.cc
index 6c9200e..4bad5b2 100644
--- a/content/public/test/browser_test_utils.cc
+++ b/content/public/test/browser_test_utils.cc
@@ -28,9 +28,9 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/values.h"
 #include "build/build_config.h"
-#include "cc/surfaces/frame_sink_manager.h"
 #include "cc/surfaces/surface.h"
 #include "cc/surfaces/surface_manager.h"
+#include "components/viz/service/frame_sinks/frame_sink_manager.h"
 #include "content/browser/accessibility/browser_accessibility.h"
 #include "content/browser/accessibility/browser_accessibility_manager.h"
 #include "content/browser/browser_plugin/browser_plugin_guest.h"
diff --git a/content/browser/loader/test_url_loader_client.cc b/content/public/test/test_url_loader_client.cc
similarity index 98%
rename from content/browser/loader/test_url_loader_client.cc
rename to content/public/test/test_url_loader_client.cc
index 5695002..36a2700 100644
--- a/content/browser/loader/test_url_loader_client.cc
+++ b/content/public/test/test_url_loader_client.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "content/browser/loader/test_url_loader_client.h"
+#include "content/public/test/test_url_loader_client.h"
 
 #include "base/memory/ref_counted.h"
 #include "base/run_loop.h"
diff --git a/content/browser/loader/test_url_loader_client.h b/content/public/test/test_url_loader_client.h
similarity index 94%
rename from content/browser/loader/test_url_loader_client.h
rename to content/public/test/test_url_loader_client.h
index bb5e249..c5d5a705 100644
--- a/content/browser/loader/test_url_loader_client.h
+++ b/content/public/test/test_url_loader_client.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CONTENT_BROWSER_LOADER_TEST_URL_LOADER_CLIENT_H_
-#define CONTENT_BROWSER_LOADER_TEST_URL_LOADER_CLIENT_H_
+#ifndef CONTENT_PUBLIC_TEST_TEST_URL_LOADER_CLIENT_H_
+#define CONTENT_PUBLIC_TEST_TEST_URL_LOADER_CLIENT_H_
 
 #include <stdint.h>
 #include <vector>
@@ -57,9 +57,7 @@
   const ResourceResponseHead& response_head() const { return response_head_; }
   const base::Optional<net::SSLInfo>& ssl_info() const { return ssl_info_; }
   const net::RedirectInfo& redirect_info() const { return redirect_info_; }
-  const std::string& cached_metadata() const {
-    return cached_metadata_;
-  }
+  const std::string& cached_metadata() const { return cached_metadata_; }
   mojo::DataPipeConsumerHandle response_body() { return response_body_.get(); }
   mojo::ScopedDataPipeConsumerHandle response_body_release() {
     return std::move(response_body_);
@@ -131,4 +129,4 @@
 
 }  // namespace content
 
-#endif  // CONTENT_BROWSER_LOADER_TEST_URL_LOADER_CLIENT_H_
+#endif  // CONTENT_PUBLIC_TEST_TEST_URL_LOADER_CLIENT_H_
diff --git a/content/renderer/android/synchronous_layer_tree_frame_sink.cc b/content/renderer/android/synchronous_layer_tree_frame_sink.cc
index f0b1b590..63a7623 100644
--- a/content/renderer/android/synchronous_layer_tree_frame_sink.cc
+++ b/content/renderer/android/synchronous_layer_tree_frame_sink.cc
@@ -23,10 +23,10 @@
 #include "cc/output/texture_mailbox_deleter.h"
 #include "cc/quads/render_pass.h"
 #include "cc/quads/surface_draw_quad.h"
-#include "cc/surfaces/frame_sink_manager.h"
 #include "components/viz/common/surfaces/local_surface_id_allocator.h"
 #include "components/viz/service/display/display.h"
 #include "components/viz/service/frame_sinks/compositor_frame_sink_support.h"
+#include "components/viz/service/frame_sinks/frame_sink_manager.h"
 #include "content/common/android/sync_compositor_messages.h"
 #include "content/common/view_messages.h"
 #include "content/renderer/android/synchronous_compositor_filter.h"
@@ -126,7 +126,7 @@
       sender_(RenderThreadImpl::current()->sync_compositor_message_filter()),
       memory_policy_(0u),
       frame_swap_message_queue_(frame_swap_message_queue),
-      frame_sink_manager_(new cc::FrameSinkManager),
+      frame_sink_manager_(new viz::FrameSinkManager),
       local_surface_id_allocator_(new viz::LocalSurfaceIdAllocator),
       begin_frame_source_(std::move(begin_frame_source)) {
   DCHECK(registry_);
diff --git a/content/renderer/android/synchronous_layer_tree_frame_sink.h b/content/renderer/android/synchronous_layer_tree_frame_sink.h
index 2f9ab551..3718d31 100644
--- a/content/renderer/android/synchronous_layer_tree_frame_sink.h
+++ b/content/renderer/android/synchronous_layer_tree_frame_sink.h
@@ -28,7 +28,6 @@
 namespace cc {
 class BeginFrameSource;
 class ContextProvider;
-class FrameSinkManager;
 }  // namespace cc
 
 namespace IPC {
@@ -39,6 +38,7 @@
 namespace viz {
 class CompositorFrameSinkSupport;
 class Display;
+class FrameSinkManager;
 class LocalSurfaceIdAllocator;
 }  // namespace viz
 
@@ -156,7 +156,7 @@
 
   // TODO(danakj): These don't to be stored in unique_ptrs when OutputSurface
   // is owned/destroyed on the compositor thread.
-  std::unique_ptr<cc::FrameSinkManager> frame_sink_manager_;
+  std::unique_ptr<viz::FrameSinkManager> frame_sink_manager_;
   std::unique_ptr<viz::LocalSurfaceIdAllocator> local_surface_id_allocator_;
   viz::LocalSurfaceId child_local_surface_id_;
   viz::LocalSurfaceId root_local_surface_id_;
diff --git a/content/renderer/presentation/presentation_connection_proxy.cc b/content/renderer/presentation/presentation_connection_proxy.cc
index d768ca5..f103b40 100644
--- a/content/renderer/presentation/presentation_connection_proxy.cc
+++ b/content/renderer/presentation/presentation_connection_proxy.cc
@@ -15,6 +15,15 @@
 
 namespace content {
 
+namespace {
+
+void OnMessageSent(bool success) {
+  DLOG_IF(ERROR, !success)
+      << "Target PresentationConnection failed to process message!";
+}
+
+}  // namespace
+
 PresentationConnectionProxy::PresentationConnectionProxy(
     blink::WebPresentationConnection* source_connection)
     : binding_(this),
@@ -25,13 +34,6 @@
 
 PresentationConnectionProxy::~PresentationConnectionProxy() = default;
 
-void PresentationConnectionProxy::SendConnectionMessage(
-    PresentationConnectionMessage message,
-    OnMessageCallback callback) const {
-  DCHECK(target_connection_ptr_);
-  target_connection_ptr_->OnMessage(std::move(message), std::move(callback));
-}
-
 void PresentationConnectionProxy::OnMessage(
     PresentationConnectionMessage message,
     OnMessageCallback callback) {
@@ -88,6 +90,37 @@
   }
 }
 
+void PresentationConnectionProxy::SendTextMessage(
+    const blink::WebString& message) {
+  auto utf8_string = message.Utf8();
+  if (utf8_string.size() > kMaxPresentationConnectionMessageSize) {
+    // TODO(crbug.com/459008): Limit the size of individual messages to 64k
+    // for now. Consider throwing DOMException or splitting bigger messages
+    // into smaller chunks later.
+    LOG(WARNING) << "message size exceeded limit!";
+    return;
+  }
+  SendConnectionMessage(PresentationConnectionMessage(utf8_string));
+}
+
+void PresentationConnectionProxy::SendBinaryMessage(const uint8_t* data,
+                                                    size_t length) {
+  if (length > kMaxPresentationConnectionMessageSize) {
+    // TODO(crbug.com/459008): Same as in SendTextMessage().
+    LOG(WARNING) << "data size exceeded limit!";
+    return;
+  }
+  SendConnectionMessage(
+      PresentationConnectionMessage(std::vector<uint8_t>(data, data + length)));
+}
+
+void PresentationConnectionProxy::SendConnectionMessage(
+    PresentationConnectionMessage message) const {
+  DCHECK(target_connection_ptr_);
+  target_connection_ptr_->OnMessage(std::move(message),
+                                    base::BindOnce(&OnMessageSent));
+}
+
 ControllerConnectionProxy::ControllerConnectionProxy(
     blink::WebPresentationConnection* controller_connection)
     : PresentationConnectionProxy(controller_connection) {}
diff --git a/content/renderer/presentation/presentation_connection_proxy.h b/content/renderer/presentation/presentation_connection_proxy.h
index 190fdafe..3cd5c81 100644
--- a/content/renderer/presentation/presentation_connection_proxy.h
+++ b/content/renderer/presentation/presentation_connection_proxy.h
@@ -76,9 +76,6 @@
 
   ~PresentationConnectionProxy() override;
 
-  virtual void SendConnectionMessage(PresentationConnectionMessage message,
-                                     OnMessageCallback callback) const;
-
   // blink::mojom::PresentationConnection implementation
   void OnMessage(PresentationConnectionMessage message,
                  OnMessageCallback callback) override;
@@ -89,6 +86,8 @@
   void Close() const override;
   void NotifyTargetConnection(
       blink::WebPresentationConnectionState state) override;
+  void SendTextMessage(const blink::WebString& message) override;
+  void SendBinaryMessage(const uint8_t* data, size_t length) override;
 
  protected:
   explicit PresentationConnectionProxy(
@@ -100,6 +99,11 @@
   // Raw pointer to Blink connection object owning this proxy object. Does not
   // take ownership.
   blink::WebPresentationConnection* const source_connection_;
+
+ private:
+  void SendConnectionMessage(PresentationConnectionMessage message) const;
+
+  DISALLOW_COPY_AND_ASSIGN(PresentationConnectionProxy);
 };
 
 // Represents PresentationConnectionProxy object on controlling frame.
diff --git a/content/renderer/presentation/presentation_connection_proxy_unittest.cc b/content/renderer/presentation/presentation_connection_proxy_unittest.cc
index 6833498e..da29263f 100644
--- a/content/renderer/presentation/presentation_connection_proxy_unittest.cc
+++ b/content/renderer/presentation/presentation_connection_proxy_unittest.cc
@@ -69,10 +69,6 @@
     receiver_connection_.reset();
   }
 
-  void ExpectSendConnectionMessageCallback(bool success) {
-    EXPECT_TRUE(success);
-  }
-
  protected:
   std::unique_ptr<TestPresentationConnection> controller_connection_;
   std::unique_ptr<TestPresentationConnection> receiver_connection_;
@@ -88,11 +84,7 @@
   blink::WebString message = blink::WebString::FromUTF8("test message");
   base::RunLoop run_loop;
   EXPECT_CALL(*receiver_connection_, DidReceiveTextMessage(message));
-  controller_connection_proxy_->SendConnectionMessage(
-      PresentationConnectionMessage(message.Utf8()),
-      base::Bind(
-          &PresentationConnectionProxyTest::ExpectSendConnectionMessageCallback,
-          base::Unretained(this)));
+  controller_connection_proxy_->SendTextMessage(message);
   run_loop.RunUntilIdle();
 }
 
@@ -109,11 +101,8 @@
             EXPECT_EQ(expected_data, message_data);
           }));
 
-  controller_connection_proxy_->SendConnectionMessage(
-      PresentationConnectionMessage(expected_data),
-      base::Bind(
-          &PresentationConnectionProxyTest::ExpectSendConnectionMessageCallback,
-          base::Unretained(this)));
+  controller_connection_proxy_->SendBinaryMessage(expected_data.data(),
+                                                  expected_data.size());
   run_loop.RunUntilIdle();
 }
 
diff --git a/content/renderer/presentation/presentation_dispatcher.cc b/content/renderer/presentation/presentation_dispatcher.cc
index 8e7c200..70ef218 100644
--- a/content/renderer/presentation/presentation_dispatcher.cc
+++ b/content/renderer/presentation/presentation_dispatcher.cc
@@ -13,7 +13,6 @@
 #include "base/memory/ptr_util.h"
 #include "base/stl_util.h"
 #include "base/threading/thread_task_runner_handle.h"
-#include "content/public/common/presentation_connection_message.h"
 #include "content/public/renderer/render_frame.h"
 #include "content/renderer/presentation/presentation_connection_proxy.h"
 #include "services/service_manager/public/cpp/interface_provider.h"
@@ -153,26 +152,6 @@
                  base::Unretained(this), base::Passed(&callback)));
 }
 
-void PresentationDispatcher::SendString(
-    const blink::WebURL& presentationUrl,
-    const blink::WebString& presentationId,
-    const blink::WebString& message,
-    const blink::WebPresentationConnectionProxy* connection_proxy) {
-  if (message.Utf8().size() > kMaxPresentationConnectionMessageSize) {
-    // TODO(crbug.com/459008): Limit the size of individual messages to 64k
-    // for now. Consider throwing DOMException or splitting bigger messages
-    // into smaller chunks later.
-    LOG(WARNING) << "message size exceeded limit!";
-    return;
-  }
-
-  message_request_queue_.push_back(CreateSendTextMessageRequest(
-      presentationUrl, presentationId, message, connection_proxy));
-  // Start processing request if only one in the queue.
-  if (message_request_queue_.size() == 1)
-    DoSendMessage(message_request_queue_.front().get());
-}
-
 void PresentationDispatcher::TerminatePresentation(
     const blink::WebURL& presentationUrl,
     const blink::WebString& presentationId) {
@@ -185,59 +164,10 @@
   presentation_service_->Terminate(presentationUrl, presentationId.Utf8());
 }
 
-void PresentationDispatcher::SendArrayBuffer(
-    const blink::WebURL& presentationUrl,
-    const blink::WebString& presentationId,
-    const uint8_t* data,
-    size_t length,
-    const blink::WebPresentationConnectionProxy* connection_proxy) {
-  DCHECK(data);
-  if (length > kMaxPresentationConnectionMessageSize) {
-    // TODO(crbug.com/459008): Same as in sendString().
-    LOG(WARNING) << "data size exceeded limit!";
-    return;
-  }
-
-  message_request_queue_.push_back(CreateSendBinaryMessageRequest(
-      presentationUrl, presentationId, data, length, connection_proxy));
-  // Start processing request if only one in the queue.
-  if (message_request_queue_.size() == 1)
-    DoSendMessage(message_request_queue_.front().get());
-}
-
-void PresentationDispatcher::SendBlobData(
-    const blink::WebURL& presentationUrl,
-    const blink::WebString& presentationId,
-    const uint8_t* data,
-    size_t length,
-    const blink::WebPresentationConnectionProxy* connection_proxy) {
-  DCHECK(data);
-  if (length > kMaxPresentationConnectionMessageSize) {
-    // TODO(crbug.com/459008): Same as in sendString().
-    LOG(WARNING) << "data size exceeded limit!";
-    return;
-  }
-
-  message_request_queue_.push_back(CreateSendBinaryMessageRequest(
-      presentationUrl, presentationId, data, length, connection_proxy));
-  // Start processing request if only one in the queue.
-  if (message_request_queue_.size() == 1)
-    DoSendMessage(message_request_queue_.front().get());
-}
-
 void PresentationDispatcher::CloseConnection(
     const blink::WebURL& presentationUrl,
     const blink::WebString& presentationId,
     const blink::WebPresentationConnectionProxy* connection_proxy) {
-  message_request_queue_.erase(
-      std::remove_if(message_request_queue_.begin(),
-                     message_request_queue_.end(),
-                     [&connection_proxy](
-                         const std::unique_ptr<SendMessageRequest>& request) {
-                       return request->connection_proxy == connection_proxy;
-                     }),
-      message_request_queue_.end());
-
   connection_proxy->Close();
 
   ConnectToPresentationServiceIfNeeded();
@@ -245,38 +175,6 @@
                                          presentationId.Utf8());
 }
 
-void PresentationDispatcher::DoSendMessage(SendMessageRequest* request) {
-  DCHECK(request->connection_proxy);
-  // TODO(crbug.com/684116): Remove static_cast after moving message queue logic
-  // from PresentationDispatcher to PresentationConnectionProxy.
-  static_cast<const PresentationConnectionProxy*>(request->connection_proxy)
-      ->SendConnectionMessage(
-          std::move(request->message),
-          base::Bind(&PresentationDispatcher::HandleSendMessageRequests,
-                     base::Unretained(this)));
-}
-
-void PresentationDispatcher::HandleSendMessageRequests(bool success) {
-  // In normal cases, message_request_queue_ should not be empty at this point
-  // of time, but when DidCommitProvisionalLoad() is invoked before receiving
-  // the callback for previous send mojo call, queue would have been emptied.
-  if (message_request_queue_.empty())
-    return;
-
-  if (!success) {
-    // PresentationServiceImpl is informing that Frame has been detached or
-    // navigated away. Invalidate all pending requests.
-    MessageRequestQueue empty;
-    std::swap(message_request_queue_, empty);
-    return;
-  }
-
-  message_request_queue_.pop_front();
-  if (!message_request_queue_.empty()) {
-    DoSendMessage(message_request_queue_.front().get());
-  }
-}
-
 void PresentationDispatcher::SetControllerConnection(
     const PresentationInfo& presentation_info,
     blink::WebPresentationConnection* connection) {
@@ -394,19 +292,6 @@
   }
 }
 
-void PresentationDispatcher::DidCommitProvisionalLoad(
-    bool is_new_navigation,
-    bool is_same_document_navigation) {
-  blink::WebFrame* frame = render_frame()->GetWebFrame();
-  // If not top-level navigation.
-  if (frame->Parent() || is_same_document_navigation)
-    return;
-
-  // Remove all pending send message requests.
-  MessageRequestQueue empty;
-  std::swap(message_request_queue_, empty);
-}
-
 void PresentationDispatcher::DidFinishDocumentLoad() {
   if (receiver_)
     ConnectToPresentationServiceIfNeeded();
@@ -691,47 +576,6 @@
   return blink::mojom::ScreenAvailability::UNKNOWN;
 }
 
-PresentationDispatcher::SendMessageRequest::SendMessageRequest(
-    const PresentationInfo& presentation_info,
-    PresentationConnectionMessage connection_message,
-    const blink::WebPresentationConnectionProxy* connection_proxy)
-    : presentation_info(presentation_info),
-      message(std::move(connection_message)),
-      connection_proxy(connection_proxy) {}
-
-PresentationDispatcher::SendMessageRequest::~SendMessageRequest() {}
-
-// static
-std::unique_ptr<PresentationDispatcher::SendMessageRequest>
-PresentationDispatcher::CreateSendTextMessageRequest(
-    const blink::WebURL& presentationUrl,
-    const blink::WebString& presentationId,
-    const blink::WebString& message,
-    const blink::WebPresentationConnectionProxy* connection_proxy) {
-  PresentationInfo presentation_info(GURL(presentationUrl),
-                                     presentationId.Utf8());
-
-  return base::MakeUnique<SendMessageRequest>(
-      presentation_info, PresentationConnectionMessage(message.Utf8()),
-      connection_proxy);
-}
-
-// static
-std::unique_ptr<PresentationDispatcher::SendMessageRequest>
-PresentationDispatcher::CreateSendBinaryMessageRequest(
-    const blink::WebURL& presentationUrl,
-    const blink::WebString& presentationId,
-    const uint8_t* data,
-    size_t length,
-    const blink::WebPresentationConnectionProxy* connection_proxy) {
-  PresentationInfo presentation_info(GURL(presentationUrl),
-                                     presentationId.Utf8());
-  return base::MakeUnique<SendMessageRequest>(
-      presentation_info,
-      PresentationConnectionMessage(std::vector<uint8_t>(data, data + length)),
-      connection_proxy);
-}
-
 PresentationDispatcher::AvailabilityListener::AvailabilityListener(
     const std::vector<GURL>& availability_urls)
     : urls(availability_urls) {}
diff --git a/content/renderer/presentation/presentation_dispatcher.h b/content/renderer/presentation/presentation_dispatcher.h
index 4ee61a7..7eb4c0d9 100644
--- a/content/renderer/presentation/presentation_dispatcher.h
+++ b/content/renderer/presentation/presentation_dispatcher.h
@@ -8,7 +8,6 @@
 #include <stddef.h>
 #include <stdint.h>
 
-#include <deque>
 #include <map>
 #include <memory>
 #include <set>
@@ -19,7 +18,6 @@
 #include "base/id_map.h"
 #include "base/macros.h"
 #include "content/common/content_export.h"
-#include "content/public/common/presentation_connection_message.h"
 #include "content/public/common/presentation_info.h"
 #include "content/public/renderer/render_frame_observer.h"
 #include "mojo/public/cpp/bindings/binding.h"
@@ -39,9 +37,7 @@
 
 namespace content {
 
-class TestPresentationDispatcher;
-
-// PresentationDispatcher is a delegate for Presentation API messages used by
+// PresentationDispatcher is a delegate for Presentation API used by
 // Blink. It forwards the calls to the Mojo PresentationService.
 class CONTENT_EXPORT PresentationDispatcher
     : public RenderFrameObserver,
@@ -52,9 +48,6 @@
   ~PresentationDispatcher() override;
 
  private:
-  // TODO(crbug.com/684116): remove friend class after moving message queue
-  // logic from PresentationDispatcher to PresentationConnectionProxy.
-  friend class PresentationConnectionProxy;
   friend class TestPresentationDispatcher;
   friend class PresentationDispatcherTest;
   FRIEND_TEST_ALL_PREFIXES(PresentationDispatcherTest, TestStartPresentation);
@@ -66,9 +59,6 @@
                            TestReconnectPresentationError);
   FRIEND_TEST_ALL_PREFIXES(PresentationDispatcherTest,
                            TestReconnectPresentationNoConnection);
-  FRIEND_TEST_ALL_PREFIXES(PresentationDispatcherTest, TestSendString);
-  FRIEND_TEST_ALL_PREFIXES(PresentationDispatcherTest, TestSendArrayBuffer);
-  FRIEND_TEST_ALL_PREFIXES(PresentationDispatcherTest, TestSendBlobData);
   FRIEND_TEST_ALL_PREFIXES(PresentationDispatcherTest,
                            TestOnReceiverConnectionAvailable);
   FRIEND_TEST_ALL_PREFIXES(PresentationDispatcherTest, TestCloseConnection);
@@ -79,35 +69,6 @@
   FRIEND_TEST_ALL_PREFIXES(PresentationDispatcherTest,
                            TestSetDefaultPresentationUrls);
 
-  struct SendMessageRequest {
-    SendMessageRequest(
-        const PresentationInfo& presentation_info,
-        PresentationConnectionMessage connection_message,
-        const blink::WebPresentationConnectionProxy* connection_proxy);
-
-    ~SendMessageRequest();
-
-    PresentationInfo presentation_info;
-    PresentationConnectionMessage message;
-    // Proxy of Blink connection object |connection| calling connection.send().
-    // It does not take ownership of proxy object. Proxy object is owned by
-    // Blink connection. Blink connection is destroyed after
-    // PresentationDispatcher so |connection_proxy| should always be valid.
-    const blink::WebPresentationConnectionProxy* connection_proxy;
-  };
-
-  static std::unique_ptr<SendMessageRequest> CreateSendTextMessageRequest(
-      const blink::WebURL& presentationUrl,
-      const blink::WebString& presentationId,
-      const blink::WebString& message,
-      const blink::WebPresentationConnectionProxy* connection_proxy);
-  static std::unique_ptr<SendMessageRequest> CreateSendBinaryMessageRequest(
-      const blink::WebURL& presentationUrl,
-      const blink::WebString& presentationId,
-      const uint8_t* data,
-      size_t length,
-      const blink::WebPresentationConnectionProxy* connection_proxy);
-
   // WebPresentationClient implementation.
   void SetController(blink::WebPresentationController* controller) override;
   void SetReceiver(blink::WebPresentationReceiver*) override;
@@ -122,23 +83,6 @@
       override;
   void TerminatePresentation(const blink::WebURL& presentationUrl,
                              const blink::WebString& presentationId) override;
-  void SendString(
-      const blink::WebURL& presentationUrl,
-      const blink::WebString& presentationId,
-      const blink::WebString& message,
-      const blink::WebPresentationConnectionProxy* connection_proxy) override;
-  void SendArrayBuffer(
-      const blink::WebURL& presentationUrl,
-      const blink::WebString& presentationId,
-      const uint8_t* data,
-      size_t length,
-      const blink::WebPresentationConnectionProxy* connection_proxy) override;
-  void SendBlobData(
-      const blink::WebURL& presentationUrl,
-      const blink::WebString& presentationId,
-      const uint8_t* data,
-      size_t length,
-      const blink::WebPresentationConnectionProxy* connection_proxy) override;
   void CloseConnection(
       const blink::WebURL& presentationUrl,
       const blink::WebString& presentationId,
@@ -153,8 +97,6 @@
       const blink::WebVector<blink::WebURL>& presentationUrls) override;
 
   // RenderFrameObserver implementation.
-  void DidCommitProvisionalLoad(bool is_new_navigation,
-                                bool is_same_document_navigation) override;
   void DidFinishDocumentLoad() override;
   void OnDestruct() override;
   void WidgetWillClose() override;
@@ -181,12 +123,6 @@
       blink::mojom::PresentationConnectionRequest /*connection_request*/)
       override;
 
-  // Call to PresentationService to send the message in |request|.
-  // |presentation_info| and |message| of |reuqest| will be consumed.
-  // |HandleSendMessageRequests| will be invoked after the send is attempted.
-  void DoSendMessage(SendMessageRequest* request);
-  void HandleSendMessageRequests(bool success);
-
   // Creates ControllerConnectionProxy object |controller_connection_proxy| with
   // |connection|. Sends mojo interface ptr of |controller_connection_proxy|
   // and mojo interface request of |controller_connection_proxy|'s
@@ -208,11 +144,6 @@
   blink::mojom::PresentationServicePtr presentation_service_;
   mojo::Binding<blink::mojom::PresentationServiceClient> binding_;
 
-  // Message requests are queued here and only one message at a time is sent
-  // over mojo channel.
-  using MessageRequestQueue = std::deque<std::unique_ptr<SendMessageRequest>>;
-  MessageRequestQueue message_request_queue_;
-
   enum class ListeningState {
     INACTIVE,
     WAITING,
diff --git a/content/renderer/presentation/presentation_dispatcher_unittest.cc b/content/renderer/presentation/presentation_dispatcher_unittest.cc
index 633b7ad..f3f239f5 100644
--- a/content/renderer/presentation/presentation_dispatcher_unittest.cc
+++ b/content/renderer/presentation/presentation_dispatcher_unittest.cc
@@ -113,14 +113,6 @@
   TestPresentationConnectionProxy(blink::WebPresentationConnection* connection)
       : PresentationConnectionProxy(connection) {}
 
-  // PresentationConnectionMessage is move-only.
-  void SendConnectionMessage(PresentationConnectionMessage message,
-                             OnMessageCallback cb) const {
-    SendConnectionMessageInternal(message, cb);
-  }
-  MOCK_CONST_METHOD2(SendConnectionMessageInternal,
-                     void(const PresentationConnectionMessage&,
-                          OnMessageCallback&));
   MOCK_CONST_METHOD0(Close, void());
 };
 
@@ -461,76 +453,12 @@
   }
 }
 
-TEST_F(PresentationDispatcherTest, TestSendString) {
-  WebString message = WebString::FromUTF8("test message");
-  TestPresentationConnection connection;
-  TestPresentationConnectionProxy connection_proxy(&connection);
-
-  PresentationConnectionMessage expected_message(message.Utf8());
-
-  base::RunLoop run_loop;
-  EXPECT_CALL(connection_proxy, SendConnectionMessageInternal(_, _))
-      .WillOnce(Invoke([&expected_message](
-                           const PresentationConnectionMessage& message_request,
-                           OnMessageCallback& callback) {
-        EXPECT_EQ(message_request, expected_message);
-        std::move(callback).Run(true);
-      }));
-
-  dispatcher_.SendString(url1_, presentation_id_, message, &connection_proxy);
-  run_loop.RunUntilIdle();
-}
-
-TEST_F(PresentationDispatcherTest, TestSendArrayBuffer) {
-  std::vector<uint8_t> data(array_buffer_data(),
-                            array_buffer_data() + array_buffer_.ByteLength());
-  TestPresentationConnection connection;
-  TestPresentationConnectionProxy connection_proxy(&connection);
-  PresentationConnectionMessage expected_message(data);
-
-  base::RunLoop run_loop;
-  EXPECT_CALL(connection_proxy, SendConnectionMessageInternal(_, _))
-      .WillOnce(Invoke([&expected_message](
-                           const PresentationConnectionMessage& message_request,
-                           OnMessageCallback& callback) {
-        EXPECT_EQ(message_request, expected_message);
-        std::move(callback).Run(true);
-      }));
-  dispatcher_.SendArrayBuffer(url1_, presentation_id_, array_buffer_data(),
-                              array_buffer_.ByteLength(), &connection_proxy);
-  run_loop.RunUntilIdle();
-}
-
-TEST_F(PresentationDispatcherTest, TestSendBlobData) {
-  std::vector<uint8_t> data(array_buffer_data(),
-                            array_buffer_data() + array_buffer_.ByteLength());
-  TestPresentationConnection connection;
-  TestPresentationConnectionProxy connection_proxy(&connection);
-  PresentationConnectionMessage expected_message(data);
-
-  base::RunLoop run_loop;
-  EXPECT_CALL(connection_proxy, SendConnectionMessageInternal(_, _))
-      .WillOnce(Invoke([&expected_message](
-                           const PresentationConnectionMessage& message_request,
-                           OnMessageCallback& callback) {
-        EXPECT_EQ(message_request, expected_message);
-        std::move(callback).Run(true);
-      }));
-  dispatcher_.SendBlobData(url1_, presentation_id_, array_buffer_data(),
-                           array_buffer_.ByteLength(), &connection_proxy);
-  run_loop.RunUntilIdle();
-}
-
 TEST_F(PresentationDispatcherTest, TestOnReceiverConnectionAvailable) {
   PresentationInfo presentation_info(gurl1_, presentation_id_.Utf8());
 
-  blink::mojom::PresentationConnectionPtr controller_connection_ptr;
   TestPresentationConnection controller_connection;
-  TestPresentationConnectionProxy controller_connection_proxy(
-      &controller_connection);
-  mojo::Binding<blink::mojom::PresentationConnection> binding(
-      &controller_connection_proxy,
-      mojo::MakeRequest(&controller_connection_ptr));
+  ControllerConnectionProxy controller_connection_proxy(&controller_connection);
+  auto controller_connection_ptr = controller_connection_proxy.Bind();
 
   blink::mojom::PresentationConnectionPtr receiver_connection_ptr;
 
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 86bc5ac61..65c23fb 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -132,6 +132,8 @@
     "../public/test/test_service_manager_context.h",
     "../public/test/test_synchronous_compositor_android.cc",
     "../public/test/test_synchronous_compositor_android.h",
+    "../public/test/test_url_loader_client.cc",
+    "../public/test/test_url_loader_client.h",
     "../public/test/test_utils.cc",
     "../public/test/test_utils.h",
     "../public/test/test_web_contents_factory.h",
@@ -250,6 +252,7 @@
     "//cc/ipc:interfaces",
     "//cc/surfaces",
     "//components/leveldb/public/interfaces",
+    "//components/viz/service",
     "//content/app:both_for_content_tests",
     "//content/browser:for_content_tests",
     "//content/browser/speech/proto",
@@ -1203,8 +1206,6 @@
     "../browser/loader/temporary_file_stream_unittest.cc",
     "../browser/loader/test_resource_handler.cc",
     "../browser/loader/test_resource_handler.h",
-    "../browser/loader/test_url_loader_client.cc",
-    "../browser/loader/test_url_loader_client.h",
     "../browser/loader/throttling_resource_handler_unittest.cc",
     "../browser/loader/upload_data_stream_builder_unittest.cc",
     "../browser/loader/upload_progress_tracker_unittest.cc",
@@ -1245,6 +1246,7 @@
     "../browser/presentation/presentation_service_impl_unittest.cc",
     "../browser/renderer_host/clipboard_message_filter_unittest.cc",
     "../browser/renderer_host/compositor_resize_lock_unittest.cc",
+    "../browser/renderer_host/cursor_manager_unittest.cc",
     "../browser/renderer_host/dwrite_font_proxy_message_filter_win_unittest.cc",
     "../browser/renderer_host/input/gesture_event_queue_unittest.cc",
     "../browser/renderer_host/input/legacy_input_router_impl_unittest.cc",
diff --git a/content/test/DEPS b/content/test/DEPS
index 5cb5756..5bac68c 100644
--- a/content/test/DEPS
+++ b/content/test/DEPS
@@ -6,6 +6,7 @@
   "+components/scheduler/renderer",
   "+components/scheduler/test",
   "+components/viz/common",
+  "+components/viz/service",
 
   "+cc/blink",
   "+chromeos/audio", # For WebRTC tests.
diff --git a/content/test/gpu/generate_buildbot_json.py b/content/test/gpu/generate_buildbot_json.py
index d78c36a..4ef9c2c 100755
--- a/content/test/gpu/generate_buildbot_json.py
+++ b/content/test/gpu/generate_buildbot_json.py
@@ -707,18 +707,6 @@
       'os_type': 'win',
       'type': Types.OPTIONAL,
     },
-    'Optional Win7 Release (AMD)': {
-      'swarming_dimensions': [
-        {
-          'gpu': '1002:6613',
-          'os': 'Windows-2008ServerR2-SP1'
-        },
-      ],
-      'build_config': 'Release',
-      'swarming': True,
-      'os_type': 'win',
-      'type': Types.OPTIONAL,
-    },
     'Optional Mac Release (Intel)': {
       'swarming_dimensions': [
         {
@@ -757,46 +745,6 @@
       'os_type': 'mac',
       'type': Types.OPTIONAL,
     },
-    # BEGIN obsolete Mac bots -- remove after waterfall restarted successfully.
-    'Optional Mac 10.10 Release (Intel)': {
-      'swarming_dimensions': [
-        {
-          'gpu': '8086:0a2e',
-          'os': 'Mac-10.12'
-        },
-      ],
-      'build_config': 'Release',
-      'swarming': True,
-      'os_type': 'mac',
-      'type': Types.OPTIONAL,
-    },
-    'Optional Mac Retina Release': {
-      'swarming_dimensions': [
-        {
-          'gpu': '10de:0fe9',
-          'hidpi': '1',
-          'os': 'Mac'
-        },
-      ],
-      'build_config': 'Release',
-      'swarming': True,
-      'os_type': 'mac',
-      'type': Types.OPTIONAL,
-    },
-    'Optional Mac 10.10 Retina Release (AMD)': {
-      'swarming_dimensions': [
-        {
-          'gpu': '1002:6821',
-          'hidpi': '1',
-          'os': 'Mac'
-        },
-      ],
-      'build_config': 'Release',
-      'swarming': True,
-      'os_type': 'mac',
-      'type': Types.OPTIONAL,
-    },
-    # END obsolete Mac bots -- remove after waterfall restarted successfully.
     'Optional Linux Release (NVIDIA)': {
       'swarming_dimensions': [
         {
diff --git a/content/test/test_render_view_host.cc b/content/test/test_render_view_host.cc
index 2d4c588..0388136 100644
--- a/content/test/test_render_view_host.cc
+++ b/content/test/test_render_view_host.cc
@@ -8,8 +8,8 @@
 
 #include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
-#include "cc/surfaces/frame_sink_manager.h"
 #include "cc/surfaces/surface_manager.h"
+#include "components/viz/service/frame_sinks/frame_sink_manager.h"
 #include "content/browser/compositor/image_transport_factory.h"
 #include "content/browser/compositor/surface_utils.h"
 #include "content/browser/dom_storage/dom_storage_context_wrapper.h"
@@ -89,7 +89,7 @@
 }
 
 TestRenderWidgetHostView::~TestRenderWidgetHostView() {
-  cc::FrameSinkManager* manager = GetFrameSinkManager();
+  viz::FrameSinkManager* manager = GetFrameSinkManager();
   if (manager) {
     manager->InvalidateFrameSinkId(frame_sink_id_);
   }
diff --git a/content/utility/utility_service_factory.cc b/content/utility/utility_service_factory.cc
index abe5f28..74ffbf52 100644
--- a/content/utility/utility_service_factory.cc
+++ b/content/utility/utility_service_factory.cc
@@ -7,7 +7,7 @@
 #include "base/bind.h"
 #include "base/command_line.h"
 #include "content/child/child_process.h"
-#include "content/network/network_service.h"
+#include "content/network/network_service_impl.h"
 #include "content/public/common/content_client.h"
 #include "content/public/common/content_features.h"
 #include "content/public/common/content_switches.h"
@@ -134,7 +134,7 @@
 
 std::unique_ptr<service_manager::Service>
 UtilityServiceFactory::CreateNetworkService() {
-  return base::MakeUnique<NetworkService>(std::move(network_registry_));
+  return base::MakeUnique<NetworkServiceImpl>(std::move(network_registry_));
 }
 
 }  // namespace content
diff --git a/device/gamepad/BUILD.gn b/device/gamepad/BUILD.gn
index 5bf30b3f..5ab5ee8 100644
--- a/device/gamepad/BUILD.gn
+++ b/device/gamepad/BUILD.gn
@@ -91,8 +91,6 @@
       "GameController.framework",
       "IOKit.framework",
     ]
-
-    cflags = [ "-Wpartial-availability" ]
   }
 }
 
diff --git a/docs/README.md b/docs/README.md
index d9f77bd..834732c 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -1,9 +1,10 @@
 # Chromium docs
 
 This directory contains chromium project documentation in
-[Gitiles-flavored Markdown](https://gerrit.googlesource.com/gitiles/+/master/Documentation/markdown.md).
-It is automatically
-[rendered by Gitiles](https://chromium.googlesource.com/chromium/src/+/master/docs/).
+[Gitiles-flavored Markdown].  It is automatically [rendered by Gitiles].
+
+[Gitiles-flavored Markdown]: https://gerrit.googlesource.com/gitiles/+/master/Documentation/markdown.md
+[rendered by Gitiles]: https://chromium.googlesource.com/chromium/src/+/master/docs/
 
 If you add new documents, please also add a link to them in the Document Index
 below.
@@ -12,7 +13,8 @@
 
 ## Style guide
 
-Markdown documents must follow the [style guide](https://github.com/google/styleguide/tree/gh-pages/docguide).
+Markdown documents must follow the
+[style guide](https://github.com/google/styleguide/tree/gh-pages/docguide).
 
 ## Previewing changes
 
diff --git a/ios/chrome/browser/ui/sad_tab/sad_tab_view.mm b/ios/chrome/browser/ui/sad_tab/sad_tab_view.mm
index 588f32e0..2d08233b 100644
--- a/ios/chrome/browser/ui/sad_tab/sad_tab_view.mm
+++ b/ios/chrome/browser/ui/sad_tab/sad_tab_view.mm
@@ -383,6 +383,7 @@
                                        alpha:1.0]];
     [_messageTextView setFont:[[MDCTypography fontLoader]
                                   regularFontOfSize:kMessageTextViewFontSize]];
+    [_messageTextView setUserInteractionEnabled:NO];
   }
   return _messageTextView;
 }
diff --git a/ios/chrome/browser/web/chrome_web_client.h b/ios/chrome/browser/web/chrome_web_client.h
index e0105d46..fef040d 100644
--- a/ios/chrome/browser/web/chrome_web_client.h
+++ b/ios/chrome/browser/web/chrome_web_client.h
@@ -6,6 +6,8 @@
 #define IOS_CHROME_BROWSER_WEB_CHROME_WEB_CLIENT_H_
 
 #include <memory>
+#include <string>
+#include <vector>
 
 #include "base/macros.h"
 #include "ios/web/public/web_client.h"
@@ -19,8 +21,7 @@
   // WebClient implementation.
   std::unique_ptr<web::WebMainParts> CreateWebMainParts() override;
   void PreWebViewCreation() const override;
-  void AddAdditionalSchemes(std::vector<url::SchemeWithType>*
-                                additional_standard_schemes) const override;
+  void AddAdditionalSchemes(Schemes* schemes) const override;
   std::string GetAcceptLangs(web::BrowserState* state) const override;
   std::string GetApplicationLocale() const override;
   bool IsAppSpecificURL(const GURL& url) const override;
diff --git a/ios/chrome/browser/web/chrome_web_client.mm b/ios/chrome/browser/web/chrome_web_client.mm
index 2bb53aec..4c9ed5c 100644
--- a/ios/chrome/browser/web/chrome_web_client.mm
+++ b/ios/chrome/browser/web/chrome_web_client.mm
@@ -84,10 +84,9 @@
   }
 }
 
-void ChromeWebClient::AddAdditionalSchemes(
-    std::vector<url::SchemeWithType>* additional_standard_schemes) const {
-  url::SchemeWithType scheme = {kChromeUIScheme, url::SCHEME_WITHOUT_PORT};
-  additional_standard_schemes->push_back(scheme);
+void ChromeWebClient::AddAdditionalSchemes(Schemes* schemes) const {
+  schemes->standard_schemes.push_back(kChromeUIScheme);
+  schemes->secure_schemes.push_back(kChromeUIScheme);
 }
 
 std::string ChromeWebClient::GetAcceptLangs(web::BrowserState* state) const {
diff --git a/ios/web/public/origin_util.mm b/ios/web/public/origin_util.mm
index 55670528..16b6c9def3 100644
--- a/ios/web/public/origin_util.mm
+++ b/ios/web/public/origin_util.mm
@@ -7,10 +7,12 @@
 #import <WebKit/WebKit.h>
 
 #include "base/numerics/safe_conversions.h"
+#include "base/stl_util.h"
 #include "base/strings/sys_string_conversions.h"
 #include "net/base/url_util.h"
 #include "url/gurl.h"
 #include "url/scheme_host_port.h"
+#include "url/url_util.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
@@ -27,6 +29,9 @@
     return true;
   }
 
+  if (base::ContainsValue(url::GetSecureSchemes(), url.scheme()))
+    return true;
+
   if (net::IsLocalhost(url.HostNoBracketsPiece()))
     return true;
 
diff --git a/ios/web/public/test/fakes/test_web_client.h b/ios/web/public/test/fakes/test_web_client.h
index 13128f7e..e02f51d 100644
--- a/ios/web/public/test/fakes/test_web_client.h
+++ b/ios/web/public/test/fakes/test_web_client.h
@@ -6,6 +6,7 @@
 #define IOS_WEB_PUBLIC_TEST_FAKES_TEST_WEB_CLIENT_H_
 
 #import <Foundation/Foundation.h>
+#include <vector>
 
 #include "base/compiler_specific.h"
 #import "ios/web/public/web_client.h"
@@ -23,8 +24,8 @@
   ~TestWebClient() override;
 
   // WebClient implementation.
-  void AddAdditionalSchemes(std::vector<url::SchemeWithType>*) const override;
-  // Returns true for kTestWebUIScheme URL scheme.
+  void AddAdditionalSchemes(Schemes* schemes) const override;
+  // Returns true for kTestWebUIScheme and kTestNativeContentScheme URL schemes.
   bool IsAppSpecificURL(const GURL& url) const override;
   base::RefCountedMemory* GetDataResourceBytes(int id) const override;
   NSString* GetEarlyPageScript(BrowserState* browser_state) const override;
@@ -40,7 +41,7 @@
   void SetEarlyPageScript(NSString* page_script);
 
   // Accessors for last arguments passed to AllowCertificateError.
-  int last_cert_error_code() const { return last_cert_error_code_; };
+  int last_cert_error_code() const { return last_cert_error_code_; }
   const net::SSLInfo& last_cert_error_ssl_info() const {
     return last_cert_error_ssl_info_;
   }
diff --git a/ios/web/public/test/fakes/test_web_client.mm b/ios/web/public/test/fakes/test_web_client.mm
index f7b923b60..bf2491fb 100644
--- a/ios/web/public/test/fakes/test_web_client.mm
+++ b/ios/web/public/test/fakes/test_web_client.mm
@@ -22,15 +22,9 @@
 
 TestWebClient::~TestWebClient() {}
 
-void TestWebClient::AddAdditionalSchemes(
-    std::vector<url::SchemeWithType>* additional_standard_schemes) const {
-  url::SchemeWithType web_ui_scheme = {kTestWebUIScheme,
-                                       url::SCHEME_WITHOUT_PORT};
-  additional_standard_schemes->push_back(web_ui_scheme);
-
-  url::SchemeWithType native_scheme = {kTestNativeContentScheme,
-                                       url::SCHEME_WITHOUT_PORT};
-  additional_standard_schemes->push_back(native_scheme);
+void TestWebClient::AddAdditionalSchemes(Schemes* schemes) const {
+  schemes->standard_schemes.push_back(kTestWebUIScheme);
+  schemes->standard_schemes.push_back(kTestNativeContentScheme);
 }
 
 bool TestWebClient::IsAppSpecificURL(const GURL& url) const {
diff --git a/ios/web/public/url_schemes.h b/ios/web/public/url_schemes.h
index 6532916..0253069 100644
--- a/ios/web/public/url_schemes.h
+++ b/ios/web/public/url_schemes.h
@@ -13,11 +13,11 @@
 // not utilize WebMainRunner and that do not wish to lock the set of
 // standard schemes at init time.
 //
-// Called near the beginning of startup to register URL schemes that
-// should be parsed as "standard" with the src/url/ library. The set
-// of standard scheme is locked if |lock_schemes| is true.
+// Called near the beginning of startup to register URL schemes that should be
+// parsed as "standard" or "secure" with the src/url/ library. The set of
+// schemes is locked if |lock_schemes| is true.
 // The embedder can add additional schemes by overriding the
-// WebClient::AddAditionalSchemes method.
+// WebClient::AddAdditionalSchemes method.
 void RegisterWebSchemes(bool lock_schemes);
 
 }  // namespace web
diff --git a/ios/web/public/url_schemes.mm b/ios/web/public/url_schemes.mm
index 45b07bf..2eca932 100644
--- a/ios/web/public/url_schemes.mm
+++ b/ios/web/public/url_schemes.mm
@@ -16,17 +16,14 @@
 
 namespace web {
 
-namespace {
-void AddStandardSchemeHelper(const url::SchemeWithType& scheme) {
-  url::AddStandardScheme(scheme.scheme, scheme.type);
-}
-}  // namespace
-
 void RegisterWebSchemes(bool lock_schemes) {
-  std::vector<url::SchemeWithType> additional_standard_schemes;
-  GetWebClient()->AddAdditionalSchemes(&additional_standard_schemes);
-  std::for_each(additional_standard_schemes.begin(),
-                additional_standard_schemes.end(), AddStandardSchemeHelper);
+  web::WebClient::Schemes schemes;
+  GetWebClient()->AddAdditionalSchemes(&schemes);
+  for (const auto& scheme : schemes.standard_schemes)
+    url::AddStandardScheme(scheme.c_str(), url::SCHEME_WITHOUT_PORT);
+
+  for (const auto& scheme : schemes.secure_schemes)
+    url::AddSecureScheme(scheme.c_str());
 
   // Prevent future modification of the schemes lists. This is to prevent
   // accidental creation of data races in the program. Add*Scheme aren't
diff --git a/ios/web/public/web_client.h b/ios/web/public/web_client.h
index ff8b96e..95b5649 100644
--- a/ios/web/public/web_client.h
+++ b/ios/web/public/web_client.h
@@ -59,13 +59,25 @@
   // Gives the embedder a chance to perform tasks before a web view is created.
   virtual void PreWebViewCreation() const {}
 
-  // Gives the embedder a chance to register its own standard and saveable url
+  // An embedder may support schemes that are otherwise unknown to lower-level
+  // components. To control how /net/url and other components interpret urls of
+  // such schemes, the embedder overrides |AddAdditionalSchemes| and adds to the
+  // vectors inside the |Schemes| structure.
+  struct Schemes {
+    Schemes();
+    ~Schemes();
+    // "Standard" (RFC3986 syntax) schemes.
+    std::vector<std::string> standard_schemes;
+    // See https://www.w3.org/TR/powerful-features/#is-origin-trustworthy.
+    std::vector<std::string> secure_schemes;
+  };
+
+  // Gives the embedder a chance to register its own standard and secure url
   // schemes early on in the startup sequence.
-  virtual void AddAdditionalSchemes(
-      std::vector<url::SchemeWithType>* additional_standard_schemes) const {}
+  virtual void AddAdditionalSchemes(Schemes* schemes) const {}
 
   // Returns the languages used in the Accept-Languages HTTP header.
-  // Used to decide URL formating.
+  // Used to decide URL formatting.
   virtual std::string GetAcceptLangs(BrowserState* state) const;
 
   // Returns the embedding application locale string.
diff --git a/ios/web/public/web_client.mm b/ios/web/public/web_client.mm
index ef02e6b..2c9652b 100644
--- a/ios/web/public/web_client.mm
+++ b/ios/web/public/web_client.mm
@@ -24,6 +24,9 @@
   return g_client;
 }
 
+WebClient::Schemes::Schemes() = default;
+WebClient::Schemes::~Schemes() = default;
+
 WebClient::WebClient() {
 }
 
diff --git a/ios/web/web_state/ui/crw_web_controller.mm b/ios/web/web_state/ui/crw_web_controller.mm
index 40a5fd65..b08853ea 100644
--- a/ios/web/web_state/ui/crw_web_controller.mm
+++ b/ios/web/web_state/ui/crw_web_controller.mm
@@ -4013,8 +4013,18 @@
         self.navigationManagerImpl->GetVisibleItem();
     const GURL& visibleURL =
         visibleItem ? visibleItem->GetURL() : GURL::EmptyGURL();
-    if (![self shouldLoadURLInNativeView:visibleURL])
+    if (![self shouldLoadURLInNativeView:visibleURL]) {
       [self displayWebView];
+    } else if (base::ios::IsRunningOnIOS11OrLater()) {
+      // On iOS 11 WKWebView load is broken if view is not a part of the
+      // hierarchy. Add view to the hierarchy, but place it offscreen to
+      // workaround iOS bug (rdar://33184203).
+      // TODO(crbug.com/739390): Remove this workaround.
+      CGRect frame = [_webView frame];
+      frame.origin.y = CGRectGetHeight(UIScreen.mainScreen.bounds);
+      [_webView setFrame:frame];
+      [self.view addSubview:_webView];
+    }
   }
 }
 
diff --git a/media/BUILD.gn b/media/BUILD.gn
index ebe115a..9e03172 100644
--- a/media/BUILD.gn
+++ b/media/BUILD.gn
@@ -397,14 +397,6 @@
 # Contains tests for all targets in the "media" folder.
 # TODO(xhwang): Move mojo/capture/remoting tests here where applicable.
 test("media_unittests") {
-  # crbug.com/676418: Suppress symbol import warnings.
-  if (is_win && is_component_build) {
-    ldflags = [
-      "/ignore:4217",
-      "/ignore:4049",
-    ]
-  }
-
   deps = [
     ":unit_tests",
     "//media/audio:unit_tests",
diff --git a/media/audio/alsa/alsa_input.h b/media/audio/alsa/alsa_input.h
index d5c8532f..9f506ff 100644
--- a/media/audio/alsa/alsa_input.h
+++ b/media/audio/alsa/alsa_input.h
@@ -27,7 +27,8 @@
 // Provides an input stream for audio capture based on the ALSA PCM interface.
 // This object is not thread safe and all methods should be invoked in the
 // thread that created the object.
-class AlsaPcmInputStream : public AgcAudioStream<AudioInputStream> {
+class MEDIA_EXPORT AlsaPcmInputStream
+    : public AgcAudioStream<AudioInputStream> {
  public:
   // Pass this to the constructor if you want to attempt auto-selection
   // of the audio recording device.
diff --git a/media/base/cdm_callback_promise.h b/media/base/cdm_callback_promise.h
index c81bb9d..48d51c97 100644
--- a/media/base/cdm_callback_promise.h
+++ b/media/base/cdm_callback_promise.h
@@ -12,8 +12,6 @@
 #include "base/callback.h"
 #include "base/macros.h"
 #include "media/base/cdm_promise.h"
-// TODO(xhwang): Remove this include after http://crbug.com/656706 is fixed.
-#include "media/base/content_decryption_module.h"
 #include "media/base/media_export.h"
 
 namespace media {
diff --git a/media/base/cdm_promise.cc b/media/base/cdm_promise.cc
index 9062799..d1cb7ade 100644
--- a/media/base/cdm_promise.cc
+++ b/media/base/cdm_promise.cc
@@ -6,10 +6,41 @@
 
 namespace media {
 
-CdmPromise::CdmPromise() {
+const CdmPromise::ResolveParameterType CdmPromiseTraits<>::kType =
+    CdmPromise::VOID_TYPE;
+
+const CdmPromise::ResolveParameterType CdmPromiseTraits<int>::kType =
+    CdmPromise::INT_TYPE;
+
+const CdmPromise::ResolveParameterType CdmPromiseTraits<std::string>::kType =
+    CdmPromise::STRING_TYPE;
+
+const CdmPromise::ResolveParameterType
+    CdmPromiseTraits<CdmKeyInformation::KeyStatus>::kType =
+        CdmPromise::KEY_STATUS_TYPE;
+
+template <>
+CdmPromise::ResolveParameterType CdmPromiseTemplate<>::GetResolveParameterType()
+    const {
+  return CdmPromiseTraits<>::kType;
 }
 
-CdmPromise::~CdmPromise() {
+template <>
+CdmPromise::ResolveParameterType
+CdmPromiseTemplate<int>::GetResolveParameterType() const {
+  return CdmPromiseTraits<int>::kType;
+}
+
+template <>
+CdmPromise::ResolveParameterType
+CdmPromiseTemplate<std::string>::GetResolveParameterType() const {
+  return CdmPromiseTraits<std::string>::kType;
+}
+
+template <>
+CdmPromise::ResolveParameterType CdmPromiseTemplate<
+    CdmKeyInformation::KeyStatus>::GetResolveParameterType() const {
+  return CdmPromiseTraits<CdmKeyInformation::KeyStatus>::kType;
 }
 
 }  // namespace media
diff --git a/media/base/cdm_promise.h b/media/base/cdm_promise.h
index 26247c4..566bd59 100644
--- a/media/base/cdm_promise.h
+++ b/media/base/cdm_promise.h
@@ -11,8 +11,7 @@
 
 #include "base/logging.h"
 #include "base/macros.h"
-// TODO(xhwang): Remove this include after http://crbug.com/656706 is fixed.
-#include "media/base/content_decryption_module.h"
+#include "media/base/cdm_key_information.h"
 #include "media/base/media_export.h"
 
 namespace media {
@@ -53,8 +52,8 @@
     KEY_STATUS_TYPE
   };
 
-  CdmPromise();
-  virtual ~CdmPromise();
+  CdmPromise() = default;
+  virtual ~CdmPromise() = default;
 
   // Used to indicate that the operation failed. |exception_code| must be
   // specified. |system_code| is a Key System-specific value for the error
@@ -72,30 +71,27 @@
   DISALLOW_COPY_AND_ASSIGN(CdmPromise);
 };
 
-// For some reason the Windows compiler is not happy with the implementation
-// of CdmPromiseTemplate being in the .cc file, so moving it here.
 template <typename... T>
 struct CdmPromiseTraits {};
 
 template <>
-struct CdmPromiseTraits<> {
-  static const CdmPromise::ResolveParameterType kType = CdmPromise::VOID_TYPE;
+struct MEDIA_EXPORT CdmPromiseTraits<> {
+  static const CdmPromise::ResolveParameterType kType;
 };
 
 template <>
-struct CdmPromiseTraits<int> {
-  static const CdmPromise::ResolveParameterType kType = CdmPromise::INT_TYPE;
+struct MEDIA_EXPORT CdmPromiseTraits<int> {
+  static const CdmPromise::ResolveParameterType kType;
 };
 
 template <>
-struct CdmPromiseTraits<std::string> {
-  static const CdmPromise::ResolveParameterType kType = CdmPromise::STRING_TYPE;
+struct MEDIA_EXPORT CdmPromiseTraits<std::string> {
+  static const CdmPromise::ResolveParameterType kType;
 };
 
 template <>
-struct CdmPromiseTraits<CdmKeyInformation::KeyStatus> {
-  static const CdmPromise::ResolveParameterType kType =
-      CdmPromise::KEY_STATUS_TYPE;
+struct MEDIA_EXPORT CdmPromiseTraits<CdmKeyInformation::KeyStatus> {
+  static const CdmPromise::ResolveParameterType kType;
 };
 
 // This class adds the resolve(T) method. This class is still an interface, and
@@ -114,9 +110,7 @@
                       uint32_t system_code,
                       const std::string& error_message) = 0;
 
-  ResolveParameterType GetResolveParameterType() const override {
-    return CdmPromiseTraits<T...>::kType;
-  }
+  ResolveParameterType GetResolveParameterType() const final;
 
  protected:
   bool IsPromiseSettled() const { return is_settled_; }
@@ -147,6 +141,25 @@
   DISALLOW_COPY_AND_ASSIGN(CdmPromiseTemplate);
 };
 
+// Explicitly defining all variants of GetResolveParameterType().
+// Without this component builds on Windows fail due to versions of the same
+// method being generated in multiple DLLs.
+template <>
+MEDIA_EXPORT CdmPromise::ResolveParameterType
+CdmPromiseTemplate<>::GetResolveParameterType() const;
+
+template <>
+MEDIA_EXPORT CdmPromise::ResolveParameterType
+CdmPromiseTemplate<int>::GetResolveParameterType() const;
+
+template <>
+MEDIA_EXPORT CdmPromise::ResolveParameterType
+CdmPromiseTemplate<std::string>::GetResolveParameterType() const;
+
+template <>
+MEDIA_EXPORT CdmPromise::ResolveParameterType CdmPromiseTemplate<
+    CdmKeyInformation::KeyStatus>::GetResolveParameterType() const;
+
 }  // namespace media
 
 #endif  // MEDIA_BASE_CDM_PROMISE_H_
diff --git a/media/base/test_helpers.h b/media/base/test_helpers.h
index 9720a5e..3c80e93 100644
--- a/media/base/test_helpers.h
+++ b/media/base/test_helpers.h
@@ -183,7 +183,7 @@
                          "SourceBuffer with multiple tracks");
 }
 
-MATCHER_P2(NonkeyframePrecedesGopStartWarning,
+MATCHER_P2(KeyframeTimeGreaterThanDependant,
            keyframe_time_string,
            nonkeyframe_time_string,
            "") {
diff --git a/media/blink/websourcebuffer_impl.cc b/media/blink/websourcebuffer_impl.cc
index fe44598..d5cc744 100644
--- a/media/blink/websourcebuffer_impl.cc
+++ b/media/blink/websourcebuffer_impl.cc
@@ -21,6 +21,25 @@
 
 namespace media {
 
+static blink::WebSourceBufferClient::ParseWarning ParseWarningToBlink(
+    const SourceBufferParseWarning warning) {
+#define CHROMIUM_PARSE_WARNING_TO_BLINK_ENUM_CASE(name) \
+  case SourceBufferParseWarning::name:                  \
+    return blink::WebSourceBufferClient::ParseWarning::name
+
+  switch (warning) {
+    CHROMIUM_PARSE_WARNING_TO_BLINK_ENUM_CASE(
+        kKeyframeTimeGreaterThanDependant);
+    CHROMIUM_PARSE_WARNING_TO_BLINK_ENUM_CASE(kMuxedSequenceMode);
+  }
+
+  NOTREACHED();
+  return blink::WebSourceBufferClient::ParseWarning::
+      kKeyframeTimeGreaterThanDependant;
+
+#undef CHROMIUM_PARSE_WARNING_TO_BLINK_ENUM_CASE
+}
+
 static base::TimeDelta DoubleToTimeDelta(double time) {
   DCHECK(!std::isnan(time));
   DCHECK_NE(time, -std::numeric_limits<double>::infinity());
@@ -51,6 +70,9 @@
   demuxer_->SetTracksWatcher(
       id, base::Bind(&WebSourceBufferImpl::InitSegmentReceived,
                      base::Unretained(this)));
+  demuxer_->SetParseWarningCallback(
+      id, base::Bind(&WebSourceBufferImpl::NotifyParseWarning,
+                     base::Unretained(this)));
 }
 
 WebSourceBufferImpl::~WebSourceBufferImpl() {
@@ -200,4 +222,9 @@
   client_->InitializationSegmentReceived(trackInfoVector);
 }
 
+void WebSourceBufferImpl::NotifyParseWarning(
+    const SourceBufferParseWarning warning) {
+  client_->NotifyParseWarning(ParseWarningToBlink(warning));
+}
+
 }  // namespace media
diff --git a/media/blink/websourcebuffer_impl.h b/media/blink/websourcebuffer_impl.h
index 153f44ee..7710a85c 100644
--- a/media/blink/websourcebuffer_impl.h
+++ b/media/blink/websourcebuffer_impl.h
@@ -13,6 +13,7 @@
 #include "base/compiler_specific.h"
 #include "base/macros.h"
 #include "base/time/time.h"
+#include "media/filters/source_buffer_parse_warnings.h"
 #include "third_party/WebKit/public/platform/WebSourceBuffer.h"
 
 namespace media {
@@ -46,6 +47,9 @@
   // during an append() call.
   void InitSegmentReceived(std::unique_ptr<MediaTracks> tracks);
 
+  // Demuxer callback handler to notify Blink of a non-fatal parse warning.
+  void NotifyParseWarning(const SourceBufferParseWarning warning);
+
   std::string id_;
   ChunkDemuxer* demuxer_;  // Owned by WebMediaPlayerImpl.
 
diff --git a/media/cdm/BUILD.gn b/media/cdm/BUILD.gn
index 0a26637..0744138 100644
--- a/media/cdm/BUILD.gn
+++ b/media/cdm/BUILD.gn
@@ -91,7 +91,7 @@
 component("cdm_manager") {
   visibility = [
     "//media/gpu",
-    "//media/mojo/services:lib",
+    "//media/mojo/services",
   ]
   sources = [
     "cdm_manager.cc",
diff --git a/media/filters/BUILD.gn b/media/filters/BUILD.gn
index 2872a510..9197675 100644
--- a/media/filters/BUILD.gn
+++ b/media/filters/BUILD.gn
@@ -49,6 +49,7 @@
     "opus_constants.h",
     "pipeline_controller.cc",
     "pipeline_controller.h",
+    "source_buffer_parse_warnings.h",
     "source_buffer_range.cc",
     "source_buffer_range.h",
     "source_buffer_state.cc",
diff --git a/media/filters/chunk_demuxer.cc b/media/filters/chunk_demuxer.cc
index b6fc0c97..b5eb1c264 100644
--- a/media/filters/chunk_demuxer.cc
+++ b/media/filters/chunk_demuxer.cc
@@ -669,6 +669,14 @@
   source_state_map_[id]->SetTracksWatcher(tracks_updated_cb);
 }
 
+void ChunkDemuxer::SetParseWarningCallback(
+    const std::string& id,
+    const SourceBufferParseWarningCB& parse_warning_cb) {
+  base::AutoLock auto_lock(lock_);
+  CHECK(IsValidId(id));
+  source_state_map_[id]->SetParseWarningCallback(parse_warning_cb);
+}
+
 void ChunkDemuxer::RemoveId(const std::string& id) {
   DVLOG(1) << __func__ << " id=" << id;
   base::AutoLock auto_lock(lock_);
diff --git a/media/filters/chunk_demuxer.h b/media/filters/chunk_demuxer.h
index 17f1cd7..53f44d2 100644
--- a/media/filters/chunk_demuxer.h
+++ b/media/filters/chunk_demuxer.h
@@ -24,6 +24,7 @@
 #include "media/base/media_tracks.h"
 #include "media/base/ranges.h"
 #include "media/base/stream_parser.h"
+#include "media/filters/source_buffer_parse_warnings.h"
 #include "media/filters/source_buffer_state.h"
 #include "media/filters/source_buffer_stream.h"
 
@@ -224,6 +225,11 @@
   void SetTracksWatcher(const std::string& id,
                         const MediaTracksUpdatedCB& tracks_updated_cb);
 
+  // Notifies a caller via |parse_warning_cb| of a parse warning.
+  void SetParseWarningCallback(
+      const std::string& id,
+      const SourceBufferParseWarningCB& parse_warning_cb);
+
   // Removed an ID & associated resources that were previously added with
   // AddId().
   void RemoveId(const std::string& id);
diff --git a/media/filters/chunk_demuxer_unittest.cc b/media/filters/chunk_demuxer_unittest.cc
index 62e1b20..7da9c5c 100644
--- a/media/filters/chunk_demuxer_unittest.cc
+++ b/media/filters/chunk_demuxer_unittest.cc
@@ -371,8 +371,12 @@
                              const std::string& mime_type,
                              const std::string& codecs) {
     ChunkDemuxer::Status status = demuxer_->AddId(source_id, mime_type, codecs);
-    if (status == ChunkDemuxer::kOk)
+    if (status == ChunkDemuxer::kOk) {
       demuxer_->SetTracksWatcher(source_id, init_segment_received_cb_);
+      demuxer_->SetParseWarningCallback(
+          source_id, base::Bind(&ChunkDemuxerTest::OnParseWarningMock,
+                                base::Unretained(this)));
+    }
     return status;
   }
 
@@ -1273,6 +1277,7 @@
                     const std::vector<uint8_t>& init_data));
 
   MOCK_METHOD1(InitSegmentReceivedMock, void(std::unique_ptr<MediaTracks>&));
+  MOCK_METHOD1(OnParseWarningMock, void(const SourceBufferParseWarning));
 
   void Seek(base::TimeDelta seek_time) {
     demuxer_->StartWaitingForSeek(seek_time);
@@ -4756,6 +4761,8 @@
   ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
 
   demuxer_->SetSequenceMode(kSourceId, true);
+  EXPECT_CALL(*this,
+              OnParseWarningMock(SourceBufferParseWarning::kMuxedSequenceMode));
   EXPECT_MEDIA_LOG(MuxedSequenceModeWarning());
 
   AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "0D10K"),
@@ -4766,6 +4773,9 @@
   std::string audio_id = "audio1";
   std::string video_id = "video1";
 
+  EXPECT_CALL(*this,
+              OnParseWarningMock(SourceBufferParseWarning::kMuxedSequenceMode))
+      .Times(0);
   EXPECT_MEDIA_LOG(MuxedSequenceModeWarning()).Times(0);
 
   ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
diff --git a/media/filters/frame_processor.cc b/media/filters/frame_processor.cc
index b770e68..9e329e1a 100644
--- a/media/filters/frame_processor.cc
+++ b/media/filters/frame_processor.cc
@@ -17,8 +17,8 @@
 
 const int kMaxDroppedPrerollWarnings = 10;
 const int kMaxDtsBeyondPtsWarnings = 10;
+const int kMaxNumKeyframeTimeGreaterThanDependantWarnings = 1;
 const int kMaxMuxedSequenceModeWarnings = 1;
-const int kMaxNumNonkeyframePrecedesGopStartWarnings = 1;
 
 // Helper class to capture per-track details needed by a frame processor. Some
 // of this information may be duplicated in the short-term in the associated
@@ -27,7 +27,9 @@
 // http://www.w3.org/TR/media-source/#track-buffers.
 class MseTrackBuffer {
  public:
-  MseTrackBuffer(ChunkDemuxerStream* stream, MediaLog* media_log);
+  MseTrackBuffer(ChunkDemuxerStream* stream,
+                 MediaLog* media_log,
+                 const SourceBufferParseWarningCB& parse_warning_cb);
   ~MseTrackBuffer();
 
   // Get/set |last_decode_timestamp_|.
@@ -140,13 +142,20 @@
   // MediaLog for reporting messages and properties to debug content and engine.
   MediaLog* media_log_;
 
+  // Callback for reporting problematic conditions that are not necessarily
+  // errors.
+  SourceBufferParseWarningCB parse_warning_cb_;
+
   // Counter that limits spam to |media_log_| for MseTrackBuffer warnings.
-  int num_nonkeyframe_precedes_gop_start_warnings_ = 0;
+  int num_keyframe_time_greater_than_dependant_warnings_ = 0;
 
   DISALLOW_COPY_AND_ASSIGN(MseTrackBuffer);
 };
 
-MseTrackBuffer::MseTrackBuffer(ChunkDemuxerStream* stream, MediaLog* media_log)
+MseTrackBuffer::MseTrackBuffer(
+    ChunkDemuxerStream* stream,
+    MediaLog* media_log,
+    const SourceBufferParseWarningCB& parse_warning_cb)
     : last_decode_timestamp_(kNoDecodeTimestamp()),
       last_processed_decode_timestamp_(DecodeTimestamp()),
       last_keyframe_presentation_timestamp_(kNoTimestamp),
@@ -154,8 +163,10 @@
       highest_presentation_timestamp_(kNoTimestamp),
       needs_random_access_point_(true),
       stream_(stream),
-      media_log_(media_log) {
+      media_log_(media_log),
+      parse_warning_cb_(parse_warning_cb) {
   DCHECK(stream_);
+  DCHECK(!parse_warning_cb_.is_null());
 }
 
 MseTrackBuffer::~MseTrackBuffer() {
@@ -188,11 +199,24 @@
     DCHECK(last_keyframe_presentation_timestamp_ != kNoTimestamp);
     // This is just one case of potentially problematic GOP structures, though
     // others are more clearly disallowed in at least some of the MSE bytestream
-    // specs, especially ISOBMFF.
+    // specs, especially ISOBMFF. See https://crbug.com/739931 for more
+    // information.
     if (frame->timestamp() < last_keyframe_presentation_timestamp_) {
+      if (!num_keyframe_time_greater_than_dependant_warnings_) {
+        // At most once per each track (but potentially multiple times per
+        // playback, if there are more than one tracks that exhibit this
+        // sequence in a playback) report a RAPPOR URL instance and also run the
+        // warning's callback.
+        media_log_->RecordRapporWithSecurityOrigin(
+            "Media.OriginUrl.MSE.KeyframeTimeGreaterThanDependant");
+        DCHECK(!parse_warning_cb_.is_null());
+        parse_warning_cb_.Run(
+            SourceBufferParseWarning::kKeyframeTimeGreaterThanDependant);
+      }
+
       LIMITED_MEDIA_LOG(DEBUG, media_log_,
-                        num_nonkeyframe_precedes_gop_start_warnings_,
-                        kMaxNumNonkeyframePrecedesGopStartWarnings)
+                        num_keyframe_time_greater_than_dependant_warnings_,
+                        kMaxNumKeyframeTimeGreaterThanDependantWarnings)
           << "Warning: presentation time of most recently processed random "
              "access point ("
           << last_keyframe_presentation_timestamp_
@@ -240,6 +264,13 @@
   DVLOG(2) << __func__ << "()";
 }
 
+void FrameProcessor::SetParseWarningCallback(
+    const SourceBufferParseWarningCB& parse_warning_cb) {
+  DCHECK(parse_warning_cb_.is_null());
+  DCHECK(!parse_warning_cb.is_null());
+  parse_warning_cb_ = parse_warning_cb;
+}
+
 void FrameProcessor::SetSequenceMode(bool sequence_mode) {
   DVLOG(2) << __func__ << "(" << sequence_mode << ")";
   // Per June 9, 2016 MSE spec editor's draft:
@@ -274,6 +305,17 @@
   DCHECK(!frames.empty());
 
   if (sequence_mode_ && track_buffers_.size() > 1) {
+    if (!num_muxed_sequence_mode_warnings_) {
+      // At most once per SourceBuffer (but potentially multiple times per
+      // playback, if there are more than one SourceBuffers used this way in a
+      // playback) report a RAPPOR URL instance and also run the warning's
+      // callback.
+      media_log_->RecordRapporWithSecurityOrigin(
+          "Media.OriginUrl.MSE.MuxedSequenceModeSourceBuffer");
+      DCHECK(!parse_warning_cb_.is_null());
+      parse_warning_cb_.Run(SourceBufferParseWarning::kMuxedSequenceMode);
+    }
+
     LIMITED_MEDIA_LOG(DEBUG, media_log_, num_muxed_sequence_mode_warnings_,
                       kMaxMuxedSequenceModeWarnings)
         << "Warning: using MSE 'sequence' AppendMode for a SourceBuffer with "
@@ -335,7 +377,8 @@
     return false;
   }
 
-  track_buffers_[id] = base::MakeUnique<MseTrackBuffer>(stream, media_log_);
+  track_buffers_[id] =
+      base::MakeUnique<MseTrackBuffer>(stream, media_log_, parse_warning_cb_);
   return true;
 }
 
diff --git a/media/filters/frame_processor.h b/media/filters/frame_processor.h
index 2a7d33d..a97fc7c 100644
--- a/media/filters/frame_processor.h
+++ b/media/filters/frame_processor.h
@@ -15,6 +15,7 @@
 #include "media/base/media_log.h"
 #include "media/base/stream_parser.h"
 #include "media/filters/chunk_demuxer.h"
+#include "media/filters/source_buffer_parse_warnings.h"
 
 namespace media {
 
@@ -30,6 +31,11 @@
                  MediaLog* media_log);
   ~FrameProcessor();
 
+  // This must be called exactly once, before doing any track buffer creation or
+  // frame processing.
+  void SetParseWarningCallback(
+      const SourceBufferParseWarningCB& parse_warning_cb);
+
   // Get/set the current append mode, which if true means "sequence" and if
   // false means "segments".
   // See http://www.w3.org/TR/media-source/#widl-SourceBuffer-mode.
@@ -169,6 +175,10 @@
   // MediaLog for reporting messages and properties to debug content and engine.
   MediaLog* media_log_;
 
+  // Callback for reporting problematic conditions that are not necessarily
+  // errors.
+  SourceBufferParseWarningCB parse_warning_cb_;
+
   // Counters that limit spam to |media_log_| for frame processor warnings.
   int num_dropped_preroll_warnings_ = 0;
   int num_dts_beyond_pts_warnings_ = 0;
diff --git a/media/filters/frame_processor_unittest.cc b/media/filters/frame_processor_unittest.cc
index 1240e7b2..0c0a0ef9 100644
--- a/media/filters/frame_processor_unittest.cc
+++ b/media/filters/frame_processor_unittest.cc
@@ -43,6 +43,7 @@
   FrameProcessorTestCallbackHelper() {}
   virtual ~FrameProcessorTestCallbackHelper() {}
 
+  MOCK_METHOD1(OnParseWarning, void(const SourceBufferParseWarning));
   MOCK_METHOD1(PossibleDurationIncrease, void(base::TimeDelta new_duration));
 
   // Helper that calls the mock method as well as does basic sanity checks on
@@ -70,7 +71,11 @@
         append_window_end_(kInfiniteDuration),
         frame_duration_(base::TimeDelta::FromMilliseconds(10)),
         audio_id_(1),
-        video_id_(2) {}
+        video_id_(2) {
+    frame_processor_->SetParseWarningCallback(
+        base::Bind(&FrameProcessorTestCallbackHelper::OnParseWarning,
+                   base::Unretained(&callbacks_)));
+  }
 
   enum StreamFlags {
     HAS_AUDIO = 1 << 0,
@@ -541,6 +546,8 @@
   AddTestTracks(HAS_AUDIO | HAS_VIDEO);
   if (GetParam()) {
     frame_processor_->SetSequenceMode(true);
+    EXPECT_CALL(callbacks_,
+                OnParseWarning(SourceBufferParseWarning::kMuxedSequenceMode));
     EXPECT_MEDIA_LOG(MuxedSequenceModeWarning());
   }
 
@@ -573,6 +580,8 @@
   bool using_sequence_mode = GetParam();
   if (using_sequence_mode) {
     frame_processor_->SetSequenceMode(true);
+    EXPECT_CALL(callbacks_,
+                OnParseWarning(SourceBufferParseWarning::kMuxedSequenceMode));
     EXPECT_MEDIA_LOG(MuxedSequenceModeWarning());
     EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_ * 7));
   } else {
@@ -609,8 +618,11 @@
   AddTestTracks(HAS_AUDIO | HAS_VIDEO);
   bool using_sequence_mode = GetParam();
   frame_processor_->SetSequenceMode(using_sequence_mode);
-  if (using_sequence_mode)
+  if (using_sequence_mode) {
+    EXPECT_CALL(callbacks_,
+                OnParseWarning(SourceBufferParseWarning::kMuxedSequenceMode));
     EXPECT_MEDIA_LOG(MuxedSequenceModeWarning());
+  }
 
   // Start a coded frame group at time 100ms. Note the jagged start still uses
   // the coded frame group's start time as the range start for both streams.
@@ -730,6 +742,8 @@
     // applied to frames beginning at the first frame after the discontinuity
     // caused by the video append at 160K, below.
     SetTimestampOffset(frame_duration_ * 10);
+    EXPECT_CALL(callbacks_,
+                OnParseWarning(SourceBufferParseWarning::kMuxedSequenceMode));
     EXPECT_MEDIA_LOG(MuxedSequenceModeWarning());
   }
   EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_ * 14));
@@ -956,8 +970,11 @@
   InSequence s;
   AddTestTracks(HAS_AUDIO | HAS_VIDEO);
   frame_processor_->SetSequenceMode(using_sequence_mode);
-  if (using_sequence_mode)
+  if (using_sequence_mode) {
+    EXPECT_CALL(callbacks_,
+                OnParseWarning(SourceBufferParseWarning::kMuxedSequenceMode));
     EXPECT_MEDIA_LOG(MuxedSequenceModeWarning());
+  }
   EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_));
   ProcessFrames("", "0K");
   EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_));
@@ -1063,7 +1080,10 @@
   CheckExpectedRangesByTimestamp(video_.get(), "{ [50,70) }");
 
   EXPECT_MEDIA_LOG(ParsedDTSGreaterThanPTS());
-  EXPECT_MEDIA_LOG(NonkeyframePrecedesGopStartWarning("0.05", "0.04"));
+  EXPECT_CALL(callbacks_,
+              OnParseWarning(
+                  SourceBufferParseWarning::kKeyframeTimeGreaterThanDependant));
+  EXPECT_MEDIA_LOG(KeyframeTimeGreaterThanDependant("0.05", "0.04"));
   EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_ * 7));
   ProcessFrames("", "40|70");  // PTS=40, DTS=70
 
diff --git a/media/filters/source_buffer_parse_warnings.h b/media/filters/source_buffer_parse_warnings.h
new file mode 100644
index 0000000..c4e72ec6
--- /dev/null
+++ b/media/filters/source_buffer_parse_warnings.h
@@ -0,0 +1,26 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef MEDIA_FILTERS_SOURCE_BUFFER_PARSE_WARNINGS_H_
+#define MEDIA_FILTERS_SOURCE_BUFFER_PARSE_WARNINGS_H_
+
+#include "base/callback_forward.h"
+
+namespace media {
+
+// Non-fatal parsing, coded frame processing, or buffering warning. These are
+// intended to be used for telemetry reporting to better understand the
+// frequency at which they occur.
+enum class SourceBufferParseWarning {
+  kKeyframeTimeGreaterThanDependant,  // Reported up to once per track.
+  kMuxedSequenceMode,                 // Reported up to once per SourceBuffer.
+};
+
+// For reporting telemetry of a non-fatal SourceBufferParseWarning.
+using SourceBufferParseWarningCB =
+    base::Callback<void(SourceBufferParseWarning)>;
+
+}  // namespace media
+
+#endif  // MEDIA_FILTERS_SOURCE_BUFFER_PARSE_WARNINGS_H_
diff --git a/media/filters/source_buffer_state.cc b/media/filters/source_buffer_state.cc
index c917ced..72c18aa 100644
--- a/media/filters/source_buffer_state.cc
+++ b/media/filters/source_buffer_state.cc
@@ -197,6 +197,13 @@
   init_segment_received_cb_ = tracks_updated_cb;
 }
 
+void SourceBufferState::SetParseWarningCallback(
+    const SourceBufferParseWarningCB& parse_warning_cb) {
+  // Give the callback to |frame_processor_|; none of these warnings are
+  // currently emitted elsewhere.
+  frame_processor_->SetParseWarningCallback(parse_warning_cb);
+}
+
 bool SourceBufferState::Append(const uint8_t* data,
                                size_t length,
                                TimeDelta append_window_start,
diff --git a/media/filters/source_buffer_state.h b/media/filters/source_buffer_state.h
index ecccc54..fe689f7a 100644
--- a/media/filters/source_buffer_state.h
+++ b/media/filters/source_buffer_state.h
@@ -18,6 +18,7 @@
 #include "media/base/stream_parser.h"
 #include "media/base/stream_parser_buffer.h"
 #include "media/base/video_codecs.h"
+#include "media/filters/source_buffer_parse_warnings.h"
 
 namespace media {
 
@@ -134,6 +135,9 @@
 
   void SetTracksWatcher(const Demuxer::MediaTracksUpdatedCB& tracks_updated_cb);
 
+  void SetParseWarningCallback(
+      const SourceBufferParseWarningCB& parse_warning_cb);
+
  private:
   // State advances through this list. The intent is to ensure at least one
   // config is received prior to parser calling initialization callback, and
diff --git a/media/filters/source_buffer_state_unittest.cc b/media/filters/source_buffer_state_unittest.cc
index 3cd7759e..fe22e1a 100644
--- a/media/filters/source_buffer_state_unittest.cc
+++ b/media/filters/source_buffer_state_unittest.cc
@@ -85,6 +85,13 @@
 
     sbs->SetTracksWatcher(base::Bind(
         &SourceBufferStateTest::OnMediaTracksUpdated, base::Unretained(this)));
+
+    // These tests are not expected to issue any parse warnings.
+    EXPECT_CALL(*this, OnParseWarningMock(_)).Times(0);
+
+    sbs->SetParseWarningCallback(base::Bind(
+        &SourceBufferStateTest::OnParseWarningMock, base::Unretained(this)));
+
     return sbs;
   }
 
@@ -110,6 +117,7 @@
     return new_configs_result;
   }
 
+  MOCK_METHOD1(OnParseWarningMock, void(const SourceBufferParseWarning));
   MOCK_METHOD1(OnUpdateDuration, void(base::TimeDelta));
 
   MOCK_METHOD1(SourceInitDone, void(const StreamParser::InitParameters&));
diff --git a/media/mojo/BUILD.gn b/media/mojo/BUILD.gn
index 442a0cd..2679bbd6 100644
--- a/media/mojo/BUILD.gn
+++ b/media/mojo/BUILD.gn
@@ -97,7 +97,7 @@
     "//media/mojo/common:mojo_shared_buffer_video_frame",
     "//media/mojo/interfaces",
     "//media/mojo/interfaces:test_interfaces",
-    "//media/mojo/services:lib",
+    "//media/mojo/services",
     "//services/service_manager/tests:interfaces",
     "//testing/gmock",
     "//testing/gtest",
@@ -113,14 +113,6 @@
 }
 
 test("media_mojo_unittests") {
-  # crbug.com/676418: Suppress symbol import warnings.
-  if (is_win && is_component_build) {
-    ldflags = [
-      "/ignore:4217",
-      "/ignore:4049",
-    ]
-  }
-
   deps = [
     ":unit_tests",
     "//mojo/edk/test:run_all_unittests",
diff --git a/media/mojo/services/BUILD.gn b/media/mojo/services/BUILD.gn
index 71b68ddd..d5a2d74 100644
--- a/media/mojo/services/BUILD.gn
+++ b/media/mojo/services/BUILD.gn
@@ -11,16 +11,6 @@
 
 component("services") {
   output_name = "media_mojo_services"
-
-  public_deps = [
-    ":lib",
-  ]
-}
-
-# TODO(xhwang): Add this intermediate target because ServiceTest doesn't support
-# services that depend on shared libraries in component build.
-# See http://crbug.com/670094
-source_set("lib") {
   sources = [
     "gpu_mojo_media_client.cc",
     "gpu_mojo_media_client.h",
@@ -106,11 +96,6 @@
 service("media") {
   testonly = true
 
-  # crbug.com/676418: Suppress symbol import warnings.
-  if (is_win && is_component_build) {
-    ldflags = [ "/ignore:4217" ]
-  }
-
   sources = [
     "main.cc",
   ]
@@ -121,44 +106,39 @@
   ]
 
   deps = [
-    ":lib",
+    ":services",
     "//mojo/public/c/system",
     "//services/service_manager/public/cpp",
   ]
 }
 
-# crbug.com/676055: media_service_unittests currently fails to link in Windows
-# component builds, so don't declare it, otherwise the "all" target will still
-# try to build it.
-if (!(is_win && is_component_build)) {
-  service_test("media_service_unittests") {
-    testonly = true
+service_test("media_service_unittests") {
+  testonly = true
 
-    sources = [
-      "media_service_unittest.cc",
-    ]
+  sources = [
+    "media_service_unittest.cc",
+  ]
 
-    catalog = ":media_service_unittests_catalog"
+  catalog = ":media_service_unittests_catalog"
 
-    deps = [
-      ":lib",
-      "//base",
-      "//media",
-      "//media/base:test_support",
-      "//media/mojo/clients",
-      "//media/mojo/common",
-      "//media/mojo/interfaces",
-      "//media/mojo/interfaces:constants",
-      "//services/service_manager/public/cpp:service_test_support",
-      "//testing/gmock",
-      "//testing/gtest",
-    ]
+  deps = [
+    ":services",
+    "//base",
+    "//media",
+    "//media/base:test_support",
+    "//media/mojo/clients",
+    "//media/mojo/common",
+    "//media/mojo/interfaces",
+    "//media/mojo/interfaces:constants",
+    "//services/service_manager/public/cpp:service_test_support",
+    "//testing/gmock",
+    "//testing/gtest",
+  ]
 
-    data_deps = [
-      ":media",
-    ]
-  }
-}  # !(is_win && is_component_build)
+  data_deps = [
+    ":media",
+  ]
+}
 
 service_manifest("media_manifest") {
   name = "media"
diff --git a/media/remoting/proto_utils.h b/media/remoting/proto_utils.h
index 78cd8a3..63a8b69 100644
--- a/media/remoting/proto_utils.h
+++ b/media/remoting/proto_utils.h
@@ -15,6 +15,7 @@
 #include "media/base/cdm_config.h"
 #include "media/base/cdm_key_information.h"
 #include "media/base/cdm_promise.h"
+#include "media/base/content_decryption_module.h"
 #include "media/base/decoder_buffer.h"
 #include "media/base/demuxer_stream.h"
 #include "media/base/eme_constants.h"
diff --git a/media/test/mock_media_source.cc b/media/test/mock_media_source.cc
index 8479cdd3..e3b1a289 100644
--- a/media/test/mock_media_source.cc
+++ b/media/test/mock_media_source.cc
@@ -137,6 +137,10 @@
       kSourceId, base::Bind(&MockMediaSource::InitSegmentReceived,
                             base::Unretained(this)));
 
+  chunk_demuxer_->SetParseWarningCallback(
+      kSourceId,
+      base::Bind(&MockMediaSource::OnParseWarningMock, base::Unretained(this)));
+
   AppendData(initial_append_size_);
 }
 
diff --git a/media/test/mock_media_source.h b/media/test/mock_media_source.h
index 760c84bb..5ae1959 100644
--- a/media/test/mock_media_source.h
+++ b/media/test/mock_media_source.h
@@ -69,6 +69,8 @@
   void InitSegmentReceived(std::unique_ptr<MediaTracks> tracks);
   MOCK_METHOD1(InitSegmentReceivedMock, void(std::unique_ptr<MediaTracks>&));
 
+  MOCK_METHOD1(OnParseWarningMock, void(const SourceBufferParseWarning));
+
  private:
   MediaLog media_log_;
   scoped_refptr<DecoderBuffer> file_data_;
diff --git a/mojo/README.md b/mojo/README.md
index 4a9cb5f..2bc82e9 100644
--- a/mojo/README.md
+++ b/mojo/README.md
@@ -124,6 +124,10 @@
 ### So really, can I create like, thousands of them?
 Yes! Nobody will mind. Create millions if you like. (OK but maybe don't.)
 
+### What are the performance characteristics of Mojo?
+Compared to the old IPC in Chrome, making a Mojo call is about 1/3 faster and uses
+1/3 fewer context switches. The full data is [available here](https://docs.google.com/document/d/1n7qYjQ5iy8xAkQVMYGqjIy_AXu2_JJtMoAcOOupO_jQ/edit).
+
 ### Can I use in-process message pipes?
 Yes, and message pipe usage is identical regardless of whether the pipe actually
 crosses a process boundary -- in fact this detail is intentionally obscured.
diff --git a/net/log/file_net_log_observer.cc b/net/log/file_net_log_observer.cc
index 40100aad..49f462f 100644
--- a/net/log/file_net_log_observer.cc
+++ b/net/log/file_net_log_observer.cc
@@ -10,7 +10,6 @@
 #include <set>
 #include <string>
 #include <utility>
-#include <vector>
 
 #include "base/bind.h"
 #include "base/files/file_util.h"
@@ -197,29 +196,45 @@
   void DeleteAllFiles() override;
 
  private:
-  // Increments |current_file_idx_|, and handles the clearing and openining of
-  // the new current file. Also sets |event_files_[current_file_idx_]| to point
-  // to the new current file.
+  // Increments |current_file_idx_|, and handles the and opening of
+  // the new current file. Also sets |current_event_file_| to point to the new
+  // file.
   void IncrementCurrentFile();
 
-  // Each ScopedFILE points to a netlog event file with the file name
-  // "event_file_<index>.json". Consumers must verify that entries are non-null
-  // before using them.
-  std::vector<base::ScopedFILE> event_files_;
+  // Sets the current events file to |index| and opens the file for writing.
+  void SetCurrentFile(size_t index);
+
+  // Returns the path to the event file numbered |index|. This looks like
+  // "LOGDIR/event_file_<index>.json".
+  base::FilePath GetEventFilePath(size_t index) const;
+
+  // Gets the file path where constants are saved at the start of
+  // logging. This looks like "LOGDIR/constants.json".
+  base::FilePath GetConstantsFilePath() const;
+
+  // Gets the file path where the final data is written at the end of logging.
+  // This looks like "LOGDIR/end_netlog.json".
+  base::FilePath GetClosingFilePath() const;
+
+  // Holds the file handle for the numbered events file where data is currently
+  // being written to. The file path of this file is
+  // GetEventFilePath(current_file_idx_). The file handle may be null if an
+  // error previously occurred opening the file, or logging has been stopped.
+  base::ScopedFILE current_event_file_;
+  size_t current_event_file_size_;
 
   // The directory where the netlog files are created.
   const base::FilePath directory_;
 
-  // Indicates the total number of netlog event files, which does not include
-  // the constants file (constants.json), or closing file (end_netlog.json).
+  // Indicates the total number of netlog event files allowed.
+  // This does not count the constants file (GetConstantsFilePath()), or the
+  // closing file (GetClosingFilePath()) against the total.
   const size_t total_num_files_;
 
-  // Indicates the index of the file in |event_files_| currently being written
-  // into.
+  // Indicates the index of the events file currently being written into.
   size_t current_file_idx_;
 
-  // Indicates the maximum size of each individual netlogging file, excluding
-  // the constant file.
+  // Indicates the maximum size of each individual events file.
   const size_t max_file_size_;
 
   // Task runner for doing file operations.
@@ -429,7 +444,6 @@
       current_file_idx_(0),
       max_file_size_(max_file_size),
       task_runner_(std::move(task_runner)) {
-  event_files_.resize(total_num_files_);
 }
 
 FileNetLogObserver::BoundedFileWriter::~BoundedFileWriter() {}
@@ -438,13 +452,10 @@
     std::unique_ptr<base::Value> constants_value) {
   DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
-  // Failure opening the file will result in null entries - consumers are
-  // responsible for checking.
-  event_files_[current_file_idx_] =
-      OpenFileForWrite(directory_.AppendASCII("event_file_0.json"));
+  // Open the initial events file.
+  SetCurrentFile(0);
 
-  base::ScopedFILE constants_file =
-      OpenFileForWrite(directory_.AppendASCII("constants.json"));
+  base::ScopedFILE constants_file = OpenFileForWrite(GetConstantsFilePath());
 
   // Print constants to file and open events array.
   std::string json;
@@ -459,8 +470,7 @@
     std::unique_ptr<base::Value> polled_data) {
   DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
-  base::ScopedFILE closing_file =
-      OpenFileForWrite(directory_.AppendASCII("end_netlog.json"));
+  base::ScopedFILE closing_file = OpenFileForWrite(GetClosingFilePath());
 
   std::string json;
   if (polled_data)
@@ -471,18 +481,41 @@
     WriteToFile(closing_file, ",\n\"polledData\": ", json, "\n");
   WriteToFile(closing_file, "}\n");
 
-  // Flush all writes to disk so that files can be safely accessed on callback.
-  event_files_.clear();
+  // Close the current event file handle to ensure it flushes its writes. When
+  // the callback runs caller expects all the log files to be written and safe
+  // to read from. (Don't require the stronger guarantees of fsync() - may not
+  // be persisted to storage.).
+  current_event_file_.reset();
 }
 
 void FileNetLogObserver::BoundedFileWriter::IncrementCurrentFile() {
   DCHECK(task_runner_->RunsTasksInCurrentSequence());
+  SetCurrentFile((current_file_idx_ + 1) % total_num_files_);
+}
 
-  current_file_idx_++;
-  current_file_idx_ %= total_num_files_;
-  event_files_[current_file_idx_].reset();
-  event_files_[current_file_idx_] = OpenFileForWrite(directory_.AppendASCII(
-      "event_file_" + base::SizeTToString(current_file_idx_) + ".json"));
+void FileNetLogObserver::BoundedFileWriter::SetCurrentFile(size_t index) {
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
+  DCHECK_LT(current_file_idx_, total_num_files_);
+
+  current_file_idx_ = index;
+  current_event_file_ = OpenFileForWrite(GetEventFilePath(current_file_idx_));
+  current_event_file_size_ = 0;
+}
+
+base::FilePath FileNetLogObserver::BoundedFileWriter::GetEventFilePath(
+    size_t index) const {
+  return directory_.AppendASCII("event_file_" + base::SizeTToString(index) +
+                                ".json");
+}
+
+base::FilePath FileNetLogObserver::BoundedFileWriter::GetConstantsFilePath()
+    const {
+  return directory_.AppendASCII("constants.json");
+}
+
+base::FilePath FileNetLogObserver::BoundedFileWriter::GetClosingFilePath()
+    const {
+  return directory_.AppendASCII("end_netlog.json");
 }
 
 void FileNetLogObserver::BoundedFileWriter::Flush(
@@ -492,20 +525,13 @@
   EventQueue local_file_queue;
   write_queue->SwapQueue(&local_file_queue);
 
-  std::string to_print;
-  CHECK(!event_files_.empty());
-  size_t file_size = event_files_[current_file_idx_]
-                         ? ftell(event_files_[current_file_idx_].get())
-                         : 0;
-
   while (!local_file_queue.empty()) {
-    if (file_size >= max_file_size_) {
+    if (current_event_file_size_ >= max_file_size_) {
       // The current file is full. Start a new current file.
       IncrementCurrentFile();
-      file_size = 0;
     }
-    file_size += WriteToFile(event_files_[current_file_idx_],
-                             *local_file_queue.front(), ",\n");
+    current_event_file_size_ +=
+        WriteToFile(current_event_file_, *local_file_queue.front(), ",\n");
     local_file_queue.pop();
   }
 }
@@ -513,17 +539,13 @@
 void FileNetLogObserver::BoundedFileWriter::DeleteAllFiles() {
   DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
-  // Reset |event_files_| to release all file handles so base::DeleteFile can
-  // safely access files.
-  event_files_.clear();
+  // Reset |current_event_file_| so base::DeleteFile() can unlink it.
+  current_event_file_.reset();
 
-  base::DeleteFile(directory_.AppendASCII("constants.json"), false);
-  base::DeleteFile(directory_.AppendASCII("end_netlog.json"), false);
-  for (size_t i = 0; i < total_num_files_; i++) {
-    base::DeleteFile(directory_.AppendASCII("event_file_" +
-                                            base::SizeTToString(i) + ".json"),
-                     false);
-  }
+  base::DeleteFile(GetConstantsFilePath(), false);
+  base::DeleteFile(GetClosingFilePath(), false);
+  for (size_t i = 0; i < total_num_files_; i++)
+    base::DeleteFile(GetEventFilePath(i), false);
 }
 
 FileNetLogObserver::UnboundedFileWriter::UnboundedFileWriter(
diff --git a/net/url_request/url_request_quic_perftest.cc b/net/url_request/url_request_quic_perftest.cc
index 804afb2..a5795c2 100644
--- a/net/url_request/url_request_quic_perftest.cc
+++ b/net/url_request/url_request_quic_perftest.cc
@@ -250,7 +250,7 @@
       base::trace_event::MemoryDumpLevelOfDetail::LIGHT};
   auto on_memory_dump_done =
       [](base::Closure quit_closure, bool success, uint64_t dump_guid,
-         const base::Optional<base::trace_event::MemoryDumpCallbackResult>&) {
+         const base::trace_event::ProcessMemoryDumpsMap&) {
         base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, quit_closure);
         ASSERT_TRUE(success);
       };
diff --git a/remoting/ios/app/BUILD.gn b/remoting/ios/app/BUILD.gn
index 98552b8..1d5b19d9 100644
--- a/remoting/ios/app/BUILD.gn
+++ b/remoting/ios/app/BUILD.gn
@@ -20,6 +20,10 @@
     "app_view_controller.h",
     "client_connection_view_controller.h",
     "client_connection_view_controller.mm",
+    "first_launch_view_controller.h",
+    "first_launch_view_controller.mm",
+    "first_launch_view_presenter.h",
+    "first_launch_view_presenter.mm",
     "help_and_feedback.h",
     "help_and_feedback.mm",
     "host_collection_header_view.h",
diff --git a/remoting/ios/app/app_delegate.h b/remoting/ios/app/app_delegate.h
index e2e9bce3..2f9af1e 100644
--- a/remoting/ios/app/app_delegate.h
+++ b/remoting/ios/app/app_delegate.h
@@ -12,7 +12,6 @@
 
 - (void)showMenuAnimated:(BOOL)animated;
 - (void)hideMenuAnimated:(BOOL)animated;
-- (void)presentSignInFlow;
 
 @property(strong, nonatomic) UIWindow* window;
 @property(class, strong, nonatomic, readonly) AppDelegate* instance;
diff --git a/remoting/ios/app/app_delegate.mm b/remoting/ios/app/app_delegate.mm
index 184e164..d5c8e36 100644
--- a/remoting/ios/app/app_delegate.mm
+++ b/remoting/ios/app/app_delegate.mm
@@ -15,13 +15,15 @@
 #include "ui/base/resource/resource_bundle.h"
 
 #import "remoting/ios/app/app_view_controller.h"
+#import "remoting/ios/app/first_launch_view_presenter.h"
 #import "remoting/ios/app/help_and_feedback.h"
 #import "remoting/ios/app/remoting_view_controller.h"
 #import "remoting/ios/app/user_status_presenter.h"
 #import "remoting/ios/facade/remoting_oauth_authentication.h"
 
-@interface AppDelegate () {
+@interface AppDelegate ()<FirstLaunchViewControllerDelegate> {
   AppViewController* _appViewController;
+  FirstLaunchViewPresenter* _firstLaunchViewPresenter;
 }
 @end
 
@@ -46,7 +48,7 @@
 
 - (BOOL)application:(UIApplication*)application
     didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
-  [self launchRemotingViewController];
+  [self launchRootViewController];
   return YES;
 }
 
@@ -69,7 +71,7 @@
   [(RemotingOAuthAuthentication*)RemotingService.instance.authentication
       authenticateWithAuthorizationCode:authorizationCode];
 
-  [self launchRemotingViewController];
+  [self launchRootViewController];
   return YES;
 }
 #endif  // ifndef NDEBUG
@@ -85,11 +87,6 @@
   [_appViewController hideMenuAnimated:animated];
 }
 
-- (void)presentSignInFlow {
-  DCHECK(_appViewController != nil);
-  [_appViewController presentSignInFlow];
-}
-
 #pragma mark - Properties
 
 + (AppDelegate*)instance {
@@ -100,13 +97,19 @@
 
 #pragma mark - Private
 
-- (void)launchRemotingViewController {
+- (void)launchRootViewController {
   RemotingViewController* vc = [[RemotingViewController alloc] init];
   UINavigationController* navController =
       [[UINavigationController alloc] initWithRootViewController:vc];
   navController.navigationBarHidden = true;
   _appViewController =
       [[AppViewController alloc] initWithMainViewController:navController];
+  _firstLaunchViewPresenter =
+      [[FirstLaunchViewPresenter alloc] initWithNavController:navController
+                                       viewControllerDelegate:self];
+  if (![RemotingService.instance.authentication.user isAuthenticated]) {
+    [_firstLaunchViewPresenter presentView];
+  }
   self.window.rootViewController = _appViewController;
   [self.window makeKeyAndVisible];
   [UserStatusPresenter.instance start];
@@ -130,6 +133,13 @@
   [HelpAndFeedback.instance presentFeedbackFlowWithContext:context];
 }
 
+#pragma mark - FirstLaunchViewPresenterDelegate
+
+- (void)presentSignInFlow {
+  DCHECK(_appViewController);
+  [_appViewController presentSignInFlow];
+}
+
 #pragma mark - Private
 
 - (void)navigateToUrl:(NSString*)url
diff --git a/remoting/ios/app/first_launch_view_controller.h b/remoting/ios/app/first_launch_view_controller.h
new file mode 100644
index 0000000..aaaddf9f
--- /dev/null
+++ b/remoting/ios/app/first_launch_view_controller.h
@@ -0,0 +1,23 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef REMOTING_IOS_APP_FIRST_LAUNCH_VIEW_CONTROLLER_H_
+#define REMOTING_IOS_APP_FIRST_LAUNCH_VIEW_CONTROLLER_H_
+
+#import <UIKit/UIKit.h>
+
+@protocol FirstLaunchViewControllerDelegate<NSObject>
+
+- (void)presentSignInFlow;
+
+@end
+
+// This shows a view to ask the user to sign in.
+@interface FirstLaunchViewController : UIViewController
+
+@property(nonatomic, weak) id<FirstLaunchViewControllerDelegate> delegate;
+
+@end
+
+#endif  // REMOTING_IOS_APP_FIRST_LAUNCH_VIEW_CONTROLLER_H_
diff --git a/remoting/ios/app/first_launch_view_controller.mm b/remoting/ios/app/first_launch_view_controller.mm
new file mode 100644
index 0000000..4e318fd
--- /dev/null
+++ b/remoting/ios/app/first_launch_view_controller.mm
@@ -0,0 +1,101 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+#import "remoting/ios/app/first_launch_view_controller.h"
+
+#import "ios/third_party/material_components_ios/src/components/Buttons/src/MaterialButtons.h"
+#import "remoting/ios/app/remoting_theme.h"
+
+static const float kLogoSizeMultiplier = 0.381966f;
+static const float kLogoYOffset = -10.f;
+static const float kButtonHeight = 80.f;
+
+@interface FirstLaunchViewController () {
+  NSArray* _compactWidthConstraints;
+  NSArray* _compactHeightConstraints;
+}
+@end
+
+@implementation FirstLaunchViewController
+
+@synthesize delegate = _delegate;
+
+#pragma mark - UIViewController
+
+- (void)viewDidLoad {
+  UIImageView* imageView = [[UIImageView alloc]
+      initWithImage:[UIImage imageNamed:@"launchscreen_app_logo"]];
+  imageView.translatesAutoresizingMaskIntoConstraints = NO;
+  [self.view addSubview:imageView];
+
+  MDCFlatButton* signInButton = [[MDCFlatButton alloc] init];
+  [signInButton setTitle:@"Sign in" forState:UIControlStateNormal];
+  [signInButton sizeToFit];
+  [signInButton addTarget:self
+                   action:@selector(didTapSignIn:)
+         forControlEvents:UIControlEventTouchUpInside];
+  signInButton.customTitleColor = RemotingTheme.flatButtonTextColor;
+  signInButton.translatesAutoresizingMaskIntoConstraints = NO;
+  [self.view addSubview:signInButton];
+
+  self.view.backgroundColor = RemotingTheme.firstLaunchViewBackgroundColor;
+
+  [self initConstraints:imageView button:signInButton];
+}
+
+- (void)traitCollectionDidChange:(UITraitCollection*)previousTraitCollection {
+  [self refreshTraitCollection];
+}
+
+#pragma mark - Private
+
+- (void)didTapSignIn:(id)button {
+  [_delegate presentSignInFlow];
+}
+
+- (void)initConstraints:(UIImageView*)imageView button:(UIButton*)signInButton {
+  // This matches the constraints in LaunchScreen.storyboard.
+  [imageView setContentHuggingPriority:UILayoutPriorityRequired
+                               forAxis:UILayoutConstraintAxisVertical];
+  [imageView setContentHuggingPriority:UILayoutPriorityRequired
+                               forAxis:UILayoutConstraintAxisHorizontal];
+  _compactWidthConstraints =
+      @[ [imageView.widthAnchor constraintEqualToAnchor:self.view.widthAnchor
+                                             multiplier:kLogoSizeMultiplier] ];
+  _compactHeightConstraints =
+      @[ [imageView.heightAnchor constraintEqualToAnchor:self.view.heightAnchor
+                                              multiplier:kLogoSizeMultiplier] ];
+  [NSLayoutConstraint activateConstraints:@[
+    [imageView.centerXAnchor constraintEqualToAnchor:self.view.centerXAnchor],
+    [imageView.centerYAnchor constraintEqualToAnchor:self.view.centerYAnchor
+                                            constant:kLogoYOffset],
+    [imageView.widthAnchor constraintEqualToAnchor:imageView.heightAnchor],
+
+    [signInButton.leadingAnchor
+        constraintEqualToAnchor:self.view.leadingAnchor],
+    [signInButton.trailingAnchor
+        constraintEqualToAnchor:self.view.trailingAnchor],
+    [signInButton.bottomAnchor constraintEqualToAnchor:self.view.bottomAnchor],
+    [signInButton.heightAnchor constraintEqualToConstant:kButtonHeight],
+  ]];
+
+  [self refreshTraitCollection];
+}
+
+- (void)refreshTraitCollection {
+  if (self.traitCollection.horizontalSizeClass ==
+      UIUserInterfaceSizeClassCompact) {
+    [NSLayoutConstraint deactivateConstraints:_compactHeightConstraints];
+    [NSLayoutConstraint activateConstraints:_compactWidthConstraints];
+  } else {
+    [NSLayoutConstraint deactivateConstraints:_compactWidthConstraints];
+    [NSLayoutConstraint activateConstraints:_compactHeightConstraints];
+  }
+}
+
+@end
diff --git a/remoting/ios/app/first_launch_view_presenter.h b/remoting/ios/app/first_launch_view_presenter.h
new file mode 100644
index 0000000..bf4e254
--- /dev/null
+++ b/remoting/ios/app/first_launch_view_presenter.h
@@ -0,0 +1,28 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef REMOTING_IOS_APP_FIRST_LAUNCH_VIEW_PRESENTER_H_
+#define REMOTING_IOS_APP_FIRST_LAUNCH_VIEW_PRESENTER_H_
+
+#import <UIKit/UIKit.h>
+
+#import "remoting/ios/app/first_launch_view_controller.h"
+
+// A class to present the first launch view when the user is signed out. The
+// class will immediately start tracking the user state once it's initialized.
+// Other components should NEVER push/pop/replace the top view controller of
+// |navController|.
+@interface FirstLaunchViewPresenter : NSObject
+
+- (instancetype)initWithNavController:(UINavigationController*)navController
+               viewControllerDelegate:
+                   (id<FirstLaunchViewControllerDelegate>)delegate;
+
+// Forcibly present the first launch view. Do nothing if the view is already
+// presented.
+- (void)presentView;
+
+@end
+
+#endif  // REMOTING_IOS_APP_FIRST_LAUNCH_VIEW_PRESENTER_H_
diff --git a/remoting/ios/app/first_launch_view_presenter.mm b/remoting/ios/app/first_launch_view_presenter.mm
new file mode 100644
index 0000000..9d85f3e
--- /dev/null
+++ b/remoting/ios/app/first_launch_view_presenter.mm
@@ -0,0 +1,74 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+#import "remoting/ios/app/first_launch_view_presenter.h"
+
+#import "remoting/ios/facade/remoting_authentication.h"
+#import "remoting/ios/facade/remoting_service.h"
+
+@interface FirstLaunchViewPresenter () {
+  UINavigationController* _navController;
+  __weak id<FirstLaunchViewControllerDelegate> _vcDelegate;
+
+  // Null if the view is not presented.
+  FirstLaunchViewController* _viewController;
+}
+@end
+
+@implementation FirstLaunchViewPresenter
+
+- (instancetype)initWithNavController:(UINavigationController*)navController
+               viewControllerDelegate:
+                   (id<FirstLaunchViewControllerDelegate>)delegate {
+  _navController = navController;
+  _vcDelegate = delegate;
+
+  [[NSNotificationCenter defaultCenter]
+      addObserver:self
+         selector:@selector(userDidUpdateNotification:)
+             name:kUserDidUpdate
+           object:nil];
+
+  return self;
+}
+
+- (void)dealloc {
+  [[NSNotificationCenter defaultCenter] removeObserver:self];
+}
+
+- (void)presentView {
+  if (_viewController) {
+    return;
+  }
+  _viewController = [[FirstLaunchViewController alloc] init];
+  _viewController.delegate = _vcDelegate;
+  // TODO(yuweih): We probably want a fading transition. For some reason the
+  // transition doesn't seem to take effect.
+  // TODO(yuweih): Maybe popToRootVC here (or call a delegate to do so) so that
+  // other VC won't manipulate the view stack when the view is showing.
+  [_navController pushViewController:_viewController animated:NO];
+}
+
+#pragma mark - Notification
+
+- (void)userDidUpdateNotification:(NSNotification*)notification {
+  BOOL isAuthenticated =
+      [RemotingService.instance.authentication.user isAuthenticated];
+  if (isAuthenticated && _viewController) {
+    if (_navController.topViewController != _viewController) {
+      NSLog(@"Couldn't pop FirstLaunchView due to broken view hierarchy.");
+      return;
+    }
+    [_navController popViewControllerAnimated:NO];
+    _viewController = nil;
+  } else if (!isAuthenticated && !_viewController) {
+    [self presentView];
+  }
+}
+
+@end
diff --git a/remoting/ios/app/remoting_theme.h b/remoting/ios/app/remoting_theme.h
index f544fb0..52f5c1a 100644
--- a/remoting/ios/app/remoting_theme.h
+++ b/remoting/ios/app/remoting_theme.h
@@ -12,6 +12,7 @@
 
 // Colors
 
+@property(class, nonatomic, readonly) UIColor* firstLaunchViewBackgroundColor;
 @property(class, nonatomic, readonly) UIColor* connectionViewBackgroundColor;
 @property(class, nonatomic, readonly) UIColor* hostListBackgroundColor;
 @property(class, nonatomic, readonly) UIColor* hostListRefreshIndicatorColor;
@@ -20,6 +21,7 @@
 @property(class, nonatomic, readonly) UIColor* onlineHostColor;
 @property(class, nonatomic, readonly) UIColor* buttonBackgroundColor;
 @property(class, nonatomic, readonly) UIColor* buttonTextColor;
+@property(class, nonatomic, readonly) UIColor* flatButtonTextColor;
 @property(class, nonatomic, readonly) UIColor* setupListBackgroundColor;
 @property(class, nonatomic, readonly) UIColor* setupListTextColor;
 @property(class, nonatomic, readonly) UIColor* setupListNumberColor;
diff --git a/remoting/ios/app/remoting_theme.mm b/remoting/ios/app/remoting_theme.mm
index 4ea48e7..046ae37 100644
--- a/remoting/ios/app/remoting_theme.mm
+++ b/remoting/ios/app/remoting_theme.mm
@@ -12,6 +12,10 @@
 
 #pragma mark - Colors
 
++ (UIColor*)firstLaunchViewBackgroundColor {
+  return UIColor.whiteColor;
+}
+
 + (UIColor*)connectionViewBackgroundColor {
   static UIColor* color;
   static dispatch_once_t onceToken;
@@ -82,6 +86,15 @@
   return UIColor.whiteColor;
 }
 
++ (UIColor*)flatButtonTextColor {
+  static UIColor* color;
+  static dispatch_once_t onceToken;
+  dispatch_once(&onceToken, ^{
+    color = [UIColor colorWithRed:0.11f green:0.55f blue:0.95f alpha:1.f];
+  });
+  return color;
+}
+
 + (UIColor*)setupListBackgroundColor {
   static UIColor* color;
   static dispatch_once_t onceToken;
diff --git a/remoting/ios/app/remoting_view_controller.mm b/remoting/ios/app/remoting_view_controller.mm
index a180de4..f4054cc1 100644
--- a/remoting/ios/app/remoting_view_controller.mm
+++ b/remoting/ios/app/remoting_view_controller.mm
@@ -24,7 +24,6 @@
 #import "remoting/ios/app/remoting_menu_view_controller.h"
 #import "remoting/ios/app/remoting_theme.h"
 #import "remoting/ios/domain/client_session_details.h"
-#import "remoting/ios/facade/remoting_authentication.h"
 #import "remoting/ios/facade/remoting_service.h"
 
 #include "base/strings/sys_string_conversions.h"
@@ -138,18 +137,14 @@
          selector:@selector(hostListStateDidChangeNotification:)
              name:kHostListStateDidChange
            object:nil];
-  [[NSNotificationCenter defaultCenter]
-      addObserver:self
-         selector:@selector(userDidUpdateNotification:)
-             name:kUserDidUpdate
-           object:nil];
 }
 
-- (void)viewDidAppear:(BOOL)animated {
-  [super viewDidAppear:animated];
-  if (!_remotingService.authentication.user.isAuthenticated) {
-    [AppDelegate.instance presentSignInFlow];
-  }
+- (void)viewWillAppear:(BOOL)animated {
+  [super viewWillAppear:animated];
+
+  // Just in case the view controller misses the host list state event before
+  // the listener is registered.
+  [self refreshContent];
 }
 
 - (UIStatusBarStyle)preferredStatusBarStyle {
@@ -162,12 +157,6 @@
   [self refreshContent];
 }
 
-- (void)userDidUpdateNotification:(NSNotification*)notification {
-  if (!_remotingService.authentication.user.isAuthenticated) {
-    [AppDelegate.instance presentSignInFlow];
-  }
-}
-
 #pragma mark - HostCollectionViewControllerDelegate
 
 - (void)didSelectCell:(HostCollectionViewCell*)cell
diff --git a/sandbox/linux/BUILD.gn b/sandbox/linux/BUILD.gn
index f8c6dba..421d8b0 100644
--- a/sandbox/linux/BUILD.gn
+++ b/sandbox/linux/BUILD.gn
@@ -284,6 +284,7 @@
 
     deps = [
       "//base",
+      "//sandbox:sandbox_features",
     ]
 
     if (use_seccomp_bpf) {
diff --git a/sandbox/mac/xpc.h b/sandbox/mac/xpc.h
index 8ff1faa..44ec8a1 100644
--- a/sandbox/mac/xpc.h
+++ b/sandbox/mac/xpc.h
@@ -14,40 +14,11 @@
 
 #include "sandbox/sandbox_export.h"
 
+extern "C" {
 // Declare private types.
-extern "C" {
 typedef struct _xpc_pipe_s* xpc_pipe_t;
-}  // extern "C"
-
-#if defined(MAC_OS_X_VERSION_10_7) && \
-    MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_7
-// Redeclare methods that only exist on 10.7+ to suppress
-// -Wpartial-availability warnings.
-extern "C" {
-void xpc_dictionary_set_int64(xpc_object_t xdict,
-                              const char* key,
-                              int64_t value);
-void xpc_release(xpc_object_t object);
-bool xpc_dictionary_get_bool(xpc_object_t xdict, const char* key);
-int64_t xpc_dictionary_get_int64(xpc_object_t xdict, const char* key);
-const char* xpc_dictionary_get_string(xpc_object_t xdict, const char* key);
-uint64_t xpc_dictionary_get_uint64(xpc_object_t xdict, const char* key);
-void xpc_dictionary_set_uint64(xpc_object_t xdict,
-                               const char* key,
-                               uint64_t value);
-void xpc_dictionary_set_string(xpc_object_t xdict, const char* key,
-                               const char* string);
-xpc_object_t xpc_dictionary_create(const char* const* keys,
-                                   const xpc_object_t* values,
-                                   size_t count);
-xpc_object_t xpc_dictionary_create_reply(xpc_object_t original);
-xpc_object_t xpc_dictionary_get_value(xpc_object_t xdict, const char* key);
-char* xpc_copy_description(xpc_object_t object);
-}  // extern "C"
-#endif
 
 // Signatures for private XPC functions.
-extern "C" {
 // Dictionary manipulation.
 void xpc_dictionary_set_mach_send(xpc_object_t dictionary,
                                   const char* name,
diff --git a/sandbox/win/BUILD.gn b/sandbox/win/BUILD.gn
index 1b55549..dfb6b59 100644
--- a/sandbox/win/BUILD.gn
+++ b/sandbox/win/BUILD.gn
@@ -182,6 +182,7 @@
     "src/lpc_policy_test.cc",
     "src/named_pipe_policy_test.cc",
     "src/policy_target_test.cc",
+    "src/process_mitigations_dyncode_unittest.cc",
     "src/process_mitigations_extensionpoints_unittest.cc",
     "src/process_mitigations_imageload_unittest.cc",
     "src/process_mitigations_unittest.cc",
@@ -210,7 +211,9 @@
 
   data_deps = [
     ":cfi_unittest_exe",
-    ":sbox_integration_test_hook_dll",
+    ":sbox_integration_test_hijack_dll",
+    ":sbox_integration_test_hijack_shim_dll",
+    ":sbox_integration_test_hooking_dll",
     ":sbox_integration_test_win_proc",
   ]
 
@@ -228,7 +231,28 @@
   ]
 }
 
-loadable_module("sbox_integration_test_hook_dll") {
+shared_library("sbox_integration_test_hijack_dll") {
+  sources = [
+    "tests/integration_tests/hijack_dll.cc",
+    "tests/integration_tests/hijack_dll.def",
+    "tests/integration_tests/hijack_dlls.h",
+  ]
+}
+
+loadable_module("sbox_integration_test_hijack_shim_dll") {
+  sources = [
+    "tests/integration_tests/hijack_dlls.h",
+    "tests/integration_tests/hijack_shim_dll.cc",
+  ]
+
+  # Implicitly linking hijack_dll as loader import resolution required.
+  deps = [
+    ":sbox_integration_test_hijack_dll",
+    "//base",
+  ]
+}
+
+loadable_module("sbox_integration_test_hooking_dll") {
   sources = [
     "tests/integration_tests/hooking_dll.cc",
     "tests/integration_tests/hooking_dll.h",
diff --git a/sandbox/win/src/process_mitigations.cc b/sandbox/win/src/process_mitigations.cc
index 1fa5209..934267d6 100644
--- a/sandbox/win/src/process_mitigations.cc
+++ b/sandbox/win/src/process_mitigations.cc
@@ -8,6 +8,8 @@
 
 #include <algorithm>
 
+#include "base/files/file_path.h"
+#include "base/scoped_native_library.h"
 #include "base/win/windows_version.h"
 #include "sandbox/win/src/nt_internals.h"
 #include "sandbox/win/src/restricted_token_utils.h"
@@ -24,8 +26,11 @@
     PVOID buffer,
     SIZE_T length);
 
-typedef BOOL (WINAPI *SetDefaultDllDirectoriesFunction)(
-    DWORD DirectoryFlags);
+// API defined in libloaderapi.h >= Win8.
+using SetDefaultDllDirectoriesFunction = decltype(&SetDefaultDllDirectories);
+
+// API defined in processthreadsapi.h >= Win8.
+using SetThreadInformationFunction = decltype(&SetThreadInformation);
 
 }  // namespace
 
@@ -149,6 +154,28 @@
     }
   }
 
+  if (version < base::win::VERSION_WIN8_1)
+    return true;
+
+  // Enable dynamic code policies.
+  if (flags & MITIGATION_DYNAMIC_CODE_DISABLE ||
+      flags & MITIGATION_DYNAMIC_CODE_DISABLE_WITH_OPT_OUT) {
+    PROCESS_MITIGATION_DYNAMIC_CODE_POLICY policy = {};
+    policy.ProhibitDynamicCode = true;
+
+    // Per-thread opt-out is only supported on >= Anniversary.
+    if (version >= base::win::VERSION_WIN10_RS1 &&
+        flags & MITIGATION_DYNAMIC_CODE_DISABLE_WITH_OPT_OUT) {
+      policy.AllowThreadOptOut = true;
+    }
+
+    if (!set_process_mitigation_policy(ProcessDynamicCodePolicy, &policy,
+                                       sizeof(policy)) &&
+        ERROR_ACCESS_DENIED != ::GetLastError()) {
+      return false;
+    }
+  }
+
   if (version < base::win::VERSION_WIN10)
     return true;
 
@@ -167,14 +194,36 @@
   if (version < base::win::VERSION_WIN10_TH2)
     return true;
 
+  // Enable binary signing policies.
+  if (flags & MITIGATION_FORCE_MS_SIGNED_BINS) {
+    PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY policy = {};
+    // Allow only MS signed binaries.
+    policy.MicrosoftSignedOnly = true;
+    // NOTE: there are two other flags available to allow
+    // 1) Only Windows Store signed.
+    // 2) MS-signed, Win Store signed, and WHQL signed binaries.
+    // Support not added at the moment.
+    if (!set_process_mitigation_policy(ProcessSignaturePolicy, &policy,
+                                       sizeof(policy)) &&
+        ERROR_ACCESS_DENIED != ::GetLastError()) {
+      return false;
+    }
+  }
+
   // Enable image load policies.
   if (flags & MITIGATION_IMAGE_LOAD_NO_REMOTE ||
-      flags & MITIGATION_IMAGE_LOAD_NO_LOW_LABEL) {
+      flags & MITIGATION_IMAGE_LOAD_NO_LOW_LABEL ||
+      flags & MITIGATION_IMAGE_LOAD_PREFER_SYS32) {
     PROCESS_MITIGATION_IMAGE_LOAD_POLICY policy = {};
     if (flags & MITIGATION_IMAGE_LOAD_NO_REMOTE)
       policy.NoRemoteImages = true;
     if (flags & MITIGATION_IMAGE_LOAD_NO_LOW_LABEL)
       policy.NoLowMandatoryLabelImages = true;
+    // PreferSystem32 is only supported on >= Anniversary.
+    if (version >= base::win::VERSION_WIN10_RS1 &&
+        flags & MITIGATION_IMAGE_LOAD_PREFER_SYS32) {
+      policy.PreferSystem32Images = true;
+    }
 
     if (!set_process_mitigation_policy(ProcessImageLoadPolicy, &policy,
                                        sizeof(policy)) &&
@@ -186,6 +235,40 @@
   return true;
 }
 
+bool ApplyMitigationsToCurrentThread(MitigationFlags flags) {
+  if (!CanSetMitigationsPerThread(flags))
+    return false;
+
+  base::win::Version version = base::win::GetVersion();
+
+  if (version < base::win::VERSION_WIN10_RS1)
+    return true;
+
+  // Enable dynamic code per-thread policies.
+  if (flags & MITIGATION_DYNAMIC_CODE_OPT_OUT_THIS_THREAD) {
+    DWORD thread_policy = THREAD_DYNAMIC_CODE_ALLOW;
+
+    // NOTE: SetThreadInformation API only exists on >= Win8.  Dynamically
+    //       get function handle.
+    base::ScopedNativeLibrary dll(base::FilePath(L"kernel32.dll"));
+    if (!dll.is_valid())
+      return false;
+    SetThreadInformationFunction set_thread_info_function =
+        reinterpret_cast<SetThreadInformationFunction>(
+            dll.GetFunctionPointer("SetThreadInformation"));
+    if (set_thread_info_function == nullptr)
+      return false;
+
+    // NOTE: Must use the pseudo-handle here, a thread HANDLE won't work.
+    if (!set_thread_info_function(::GetCurrentThread(), ThreadDynamicCodePolicy,
+                                  &thread_policy, sizeof(thread_policy))) {
+      return false;
+    }
+  }
+
+  return true;
+}
+
 void ConvertProcessMitigationsToPolicy(MitigationFlags flags,
                                        DWORD64* policy_flags,
                                        size_t* size) {
@@ -259,6 +342,14 @@
         PROCESS_CREATION_MITIGATION_POLICY_EXTENSION_POINT_DISABLE_ALWAYS_ON;
   }
 
+  if (version < base::win::VERSION_WIN8_1)
+    return;
+
+  if (flags & MITIGATION_DYNAMIC_CODE_DISABLE) {
+    *policy_flags |=
+        PROCESS_CREATION_MITIGATION_POLICY_PROHIBIT_DYNAMIC_CODE_ALWAYS_ON;
+  }
+
   if (version < base::win::VERSION_WIN10)
     return;
 
@@ -266,9 +357,15 @@
     *policy_flags |= PROCESS_CREATION_MITIGATION_POLICY_FONT_DISABLE_ALWAYS_ON;
   }
 
+  // Threshold 2
   if (version < base::win::VERSION_WIN10_TH2)
     return;
 
+  if (flags & MITIGATION_FORCE_MS_SIGNED_BINS) {
+    *policy_flags |=
+        PROCESS_CREATION_MITIGATION_POLICY_BLOCK_NON_MICROSOFT_BINARIES_ALWAYS_ON;
+  }
+
   if (flags & MITIGATION_IMAGE_LOAD_NO_REMOTE) {
     *policy_flags |=
         PROCESS_CREATION_MITIGATION_POLICY_IMAGE_LOAD_NO_REMOTE_ALWAYS_ON;
@@ -278,6 +375,20 @@
     *policy_flags |=
         PROCESS_CREATION_MITIGATION_POLICY_IMAGE_LOAD_NO_LOW_LABEL_ALWAYS_ON;
   }
+
+  // Anniversary
+  if (version < base::win::VERSION_WIN10_RS1)
+    return;
+
+  if (flags & MITIGATION_DYNAMIC_CODE_DISABLE_WITH_OPT_OUT) {
+    *policy_flags |=
+        PROCESS_CREATION_MITIGATION_POLICY_PROHIBIT_DYNAMIC_CODE_ALWAYS_ON_ALLOW_OPT_OUT;
+  }
+
+  if (flags & MITIGATION_IMAGE_LOAD_PREFER_SYS32) {
+    *policy_flags |=
+        PROCESS_CREATION_MITIGATION_POLICY_IMAGE_LOAD_PREFER_SYSTEM32_ALWAYS_ON;
+  }
 }
 
 MitigationFlags FilterPostStartupProcessMitigations(MitigationFlags flags) {
@@ -326,20 +437,16 @@
   // All of these mitigations can be enabled after startup.
   return !(
       flags &
-      ~(MITIGATION_HEAP_TERMINATE |
-        MITIGATION_DEP |
-        MITIGATION_DEP_NO_ATL_THUNK |
-        MITIGATION_RELOCATE_IMAGE |
-        MITIGATION_RELOCATE_IMAGE_REQUIRED |
-        MITIGATION_BOTTOM_UP_ASLR |
-        MITIGATION_STRICT_HANDLE_CHECKS |
-        MITIGATION_EXTENSION_POINT_DISABLE |
-        MITIGATION_DLL_SEARCH_ORDER |
-        MITIGATION_HARDEN_TOKEN_IL_POLICY |
-        MITIGATION_WIN32K_DISABLE |
-        MITIGATION_NONSYSTEM_FONT_DISABLE |
-        MITIGATION_IMAGE_LOAD_NO_REMOTE |
-        MITIGATION_IMAGE_LOAD_NO_LOW_LABEL));
+      ~(MITIGATION_HEAP_TERMINATE | MITIGATION_DEP |
+        MITIGATION_DEP_NO_ATL_THUNK | MITIGATION_RELOCATE_IMAGE |
+        MITIGATION_RELOCATE_IMAGE_REQUIRED | MITIGATION_BOTTOM_UP_ASLR |
+        MITIGATION_STRICT_HANDLE_CHECKS | MITIGATION_EXTENSION_POINT_DISABLE |
+        MITIGATION_DLL_SEARCH_ORDER | MITIGATION_HARDEN_TOKEN_IL_POLICY |
+        MITIGATION_WIN32K_DISABLE | MITIGATION_DYNAMIC_CODE_DISABLE |
+        MITIGATION_DYNAMIC_CODE_DISABLE_WITH_OPT_OUT |
+        MITIGATION_FORCE_MS_SIGNED_BINS | MITIGATION_NONSYSTEM_FONT_DISABLE |
+        MITIGATION_IMAGE_LOAD_NO_REMOTE | MITIGATION_IMAGE_LOAD_NO_LOW_LABEL |
+        MITIGATION_IMAGE_LOAD_PREFER_SYS32));
 }
 
 bool CanSetProcessMitigationsPreStartup(MitigationFlags flags) {
@@ -348,5 +455,13 @@
                     MITIGATION_DLL_SEARCH_ORDER));
 }
 
+bool CanSetMitigationsPerThread(MitigationFlags flags) {
+  // If any flags EXCEPT these are set, fail.
+  if (flags & ~(MITIGATION_DYNAMIC_CODE_OPT_OUT_THIS_THREAD))
+    return false;
+
+  return true;
+}
+
 }  // namespace sandbox
 
diff --git a/sandbox/win/src/process_mitigations.h b/sandbox/win/src/process_mitigations.h
index baa462b..f9930f6 100644
--- a/sandbox/win/src/process_mitigations.h
+++ b/sandbox/win/src/process_mitigations.h
@@ -16,6 +16,10 @@
 // that are invalid for the current version of Windows.
 bool ApplyProcessMitigationsToCurrentProcess(MitigationFlags flags);
 
+// Sets the mitigation policy for the current thread, ignoring any settings
+// that are invalid for the current version of Windows.
+bool ApplyMitigationsToCurrentThread(MitigationFlags flags);
+
 // Returns the flags that must be enforced after startup for the current OS
 // version.
 MitigationFlags FilterPostStartupProcessMitigations(MitigationFlags flags);
@@ -39,6 +43,9 @@
 // Returns true if all the supplied flags can be set before a process starts.
 bool CanSetProcessMitigationsPreStartup(MitigationFlags flags);
 
+// Returns true if all the supplied flags can be set on the current thread.
+bool CanSetMitigationsPerThread(MitigationFlags flags);
+
 }  // namespace sandbox
 
 #endif  // SANDBOX_SRC_WIN_PROCESS_MITIGATIONS_H_
diff --git a/sandbox/win/src/process_mitigations_dyncode_unittest.cc b/sandbox/win/src/process_mitigations_dyncode_unittest.cc
new file mode 100644
index 0000000..dba96d4
--- /dev/null
+++ b/sandbox/win/src/process_mitigations_dyncode_unittest.cc
@@ -0,0 +1,570 @@
+// Copyright 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "sandbox/win/src/process_mitigations.h"
+
+#include <windows.h>
+
+#include <string>
+
+#include "base/path_service.h"
+#include "base/strings/stringprintf.h"
+#include "base/win/windows_version.h"
+#include "sandbox/win/src/process_mitigations.h"
+#include "sandbox/win/src/sandbox.h"
+#include "sandbox/win/src/target_services.h"
+#include "sandbox/win/tests/common/controller.h"
+#include "sandbox/win/tests/integration_tests/hooking_dll.h"
+#include "sandbox/win/tests/integration_tests/integration_tests_common.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace {
+
+//------------------------------------------------------------------------------
+// Internal Defines & Functions
+//------------------------------------------------------------------------------
+
+// Enum the dynamic code APIs being tested, to prevent hard coded int values.
+enum DynCodeAPI {
+  VIRTUALALLOC = 1,
+  VIRTUALPROTECT,
+  MAPVIEWCUSTOM,
+  MAPVIEWFILE,
+  NOTSUPPORTED  // Always leave this as the last enum.
+};
+
+// Advanced private function declaration.
+void DynamicCodeTestHarness(sandbox::MitigationFlags which_mitigation,
+                            bool expect_success,
+                            bool enable_mitigation,
+                            bool with_thread_opt_out = false);
+
+// Common helper function for the different child process dynamic code tests.
+//
+// - VirtualAlloc with PAGE_EXECUTE_*
+// - VirtualProtect with PAGE_EXECUTE_*
+// - MapViewOfFile with FILE_MAP_EXECUTE | FILE_MAP_WRITE
+int DynamicCodeTest(DynCodeAPI which_test, wchar_t* path) {
+  switch (which_test) {
+    case VIRTUALALLOC: {
+      // Test VirtualAlloc with PAGE_EXECUTE_READWRITE.
+      //-----------------------------------------------
+      // Size rounds up to one page.
+      void* allocation = ::VirtualAlloc(NULL, 1, MEM_RESERVE | MEM_COMMIT,
+                                        PAGE_EXECUTE_READWRITE);
+      if (!allocation) {
+        DWORD error = ::GetLastError();
+        return static_cast<int>(error);
+      }
+      ::VirtualFree(allocation, 0, MEM_RELEASE);
+      break;
+    }
+    case VIRTUALPROTECT: {
+      // Test VirtualProtect with PAGE_EXECUTE_READWRITE.
+      //-------------------------------------------------
+      // Use an existing executable function pointer.
+      BYTE* function = reinterpret_cast<BYTE*>(&DynamicCodeTestHarness);
+      DWORD old_protect, temp = 0;
+      // Test making executable binary writable.
+      if (!::VirtualProtect(function, sizeof(size_t), PAGE_EXECUTE_READWRITE,
+                            &old_protect)) {
+        DWORD error = ::GetLastError();
+        return static_cast<int>(error);
+      }
+      // Make sure to test the change back to executable.
+      if (!::VirtualProtect(function, sizeof(size_t), old_protect, &temp)) {
+        DWORD error = ::GetLastError();
+        return static_cast<int>(error);
+      }
+      break;
+    }
+    case MAPVIEWCUSTOM: {
+      // Test MapViewOfFile with FILE_MAP_EXECUTE | FILE_MAP_WRITE.
+      // (Custom created mapping.)
+      //-----------------------------------------------------------
+      HANDLE section =
+          ::CreateFileMappingW(INVALID_HANDLE_VALUE, NULL,
+                               PAGE_EXECUTE_READWRITE, 0, 4096, L"TestMapping");
+      if (section == NULL) {
+        DWORD error = ::GetLastError();
+        return static_cast<int>(error);
+      }
+
+      // Note: this test hinges on FILE_MAP_EXECUTE | FILE_MAP_WRITE access.
+      // Any other access request will succeed even with the mitigation enabled.
+      HANDLE* view = reinterpret_cast<HANDLE*>(::MapViewOfFile(
+          section, FILE_MAP_EXECUTE | FILE_MAP_WRITE, 0, 0, 4096));
+
+      if (view == NULL) {
+        DWORD error = ::GetLastError();
+        return static_cast<int>(error);
+      }
+
+      ::UnmapViewOfFile(view);
+      ::CloseHandle(section);
+      break;
+    }
+    case MAPVIEWFILE: {
+      // Test MapViewOfFile with FILE_MAP_EXECUTE | FILE_MAP_WRITE.
+      // (Existing file on disk mapping.)
+      //-----------------------------------------------------------
+      // Caller should have passed in a non-null file path.
+      if (path == nullptr)
+        return sandbox::SBOX_TEST_INVALID_PARAMETER;
+
+      // Note: INVALID_HANDLE_VALUE
+      HANDLE file_handle =
+          ::CreateFile(path, GENERIC_EXECUTE | GENERIC_READ | GENERIC_WRITE,
+                       FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
+                       FILE_ATTRIBUTE_NORMAL, NULL);
+      if (file_handle == INVALID_HANDLE_VALUE) {
+        DWORD error = ::GetLastError();
+        return static_cast<int>(error);
+      }
+
+      HANDLE mapping_handle = ::CreateFileMapping(
+          file_handle, NULL, PAGE_EXECUTE_READWRITE, 0, 1, NULL);
+      if (mapping_handle == NULL) {
+        ::CloseHandle(file_handle);
+        DWORD error = ::GetLastError();
+        return static_cast<int>(error);
+      }
+
+      // Note: this test hinges on FILE_MAP_EXECUTE | FILE_MAP_WRITE access.
+      // Any other access request will succeed even with the mitigation enabled.
+      void* view_start = ::MapViewOfFile(
+          mapping_handle, FILE_MAP_EXECUTE | FILE_MAP_WRITE, 0, 0, 0);
+      if (view_start == NULL) {
+        ::CloseHandle(mapping_handle);
+        ::CloseHandle(file_handle);
+        DWORD error = ::GetLastError();
+        return static_cast<int>(error);
+      }
+
+      ::UnmapViewOfFile(view_start);
+      ::CloseHandle(mapping_handle);
+      ::CloseHandle(file_handle);
+      break;
+    }
+    default:
+      return sandbox::SBOX_TEST_INVALID_PARAMETER;
+  }
+
+  return sandbox::SBOX_TEST_SUCCEEDED;
+}
+
+// Thread class for testing dynamic code per-thread opt-out.
+class DynamicCodeOptOutThread {
+ public:
+  // |path| optional, depending on |which_test|.
+  DynamicCodeOptOutThread(bool mitigation,
+                          DynCodeAPI which_test,
+                          wchar_t* path = nullptr)
+      : thread_(NULL),
+        opt_out_(mitigation),
+        which_api_test_(which_test),
+        file_path_(path),
+        return_code_(sandbox::SBOX_TEST_NOT_FOUND) {}
+
+  ~DynamicCodeOptOutThread() {
+    if (thread_ != NULL) {
+      ::CloseHandle(thread_);
+      thread_ = NULL;
+    }
+  }
+
+  // LPTHREAD_START_ROUTINE
+  static DWORD WINAPI StaticThreadFunc(LPVOID lpParam) {
+    DynamicCodeOptOutThread* this_thread =
+        reinterpret_cast<DynamicCodeOptOutThread*>(lpParam);
+    return this_thread->ThreadFunc();
+  }
+
+  // Main function.  Call this to create and start the test thread.
+  // Call Join() to get the test result.
+  void Start() {
+    if (thread_ != NULL)
+      return;
+
+    thread_ = ::CreateThread(nullptr, 0, StaticThreadFunc, this, 0, nullptr);
+    if (thread_ == NULL) {
+      return_code_ = ::GetLastError();
+      return;
+    }
+  }
+
+  // Wait for test thread to finish, and get the final test result.
+  int Join() {
+    // Handle case where thread creation failed.
+    if (thread_ == NULL)
+      return return_code_;
+
+    // NOTE: TestTimeouts::action_max_timeout() is not long enough here.  In
+    //       debug build this times out.
+    DWORD timeout = ::IsDebuggerPresent() ? INFINITE : 5000;
+    return_code_ = ::WaitForSingleObject(thread_, timeout);
+    // Handle case of abnormal thread exit (or timeout).
+    if (return_code_ != WAIT_OBJECT_0)
+      return return_code_;
+
+    if (!::GetExitCodeThread(thread_,
+                             reinterpret_cast<DWORD*>(&return_code_))) {
+      // Handle unexpected case of failing to get thread exit code.
+      return_code_ = ::GetLastError();
+      return return_code_;
+    }
+
+    return return_code_;
+  }
+
+ private:
+  DWORD ThreadFunc() {
+    // Opt-out this thread from disabled dynamic code.
+    if (opt_out_) {
+      if (!sandbox::ApplyMitigationsToCurrentThread(
+              sandbox::MITIGATION_DYNAMIC_CODE_OPT_OUT_THIS_THREAD)) {
+        return ::GetLastError();
+      }
+    }
+    // Run the test.
+    return DynamicCodeTest(which_api_test_, file_path_);
+  }
+
+  HANDLE thread_;
+  bool opt_out_;
+  DynCodeAPI which_api_test_;
+  wchar_t* file_path_;
+  int return_code_;
+
+  DISALLOW_COPY_AND_ASSIGN(DynamicCodeOptOutThread);
+};
+
+//------------------------------------------------------------------------------
+// DisableDynamicCode test harness helper function.  Tests numerous APIs.
+// - APIs fail with ERROR_DYNAMIC_CODE_BLOCKED if this mitigation is
+//   enabled and the target tries to meddle.
+// - Acquire the global g_hooking_dll_mutex mutex before calling
+//   (as we meddle with a shared system resource).
+// - Note: Do not use ASSERTs in this function, as a global mutex is held.
+//
+// Trigger test child processes (with or without mitigation enabled).
+//------------------------------------------------------------------------------
+void DynamicCodeTestHarness(sandbox::MitigationFlags which_mitigation,
+                            bool expect_success,
+                            bool enable_mitigation,
+                            bool with_thread_opt_out) {
+  if (which_mitigation != sandbox::MITIGATION_DYNAMIC_CODE_DISABLE &&
+      which_mitigation !=
+          sandbox::MITIGATION_DYNAMIC_CODE_DISABLE_WITH_OPT_OUT) {
+    ADD_FAILURE();
+    return;
+  }
+
+  sandbox::TestRunner runner;
+  sandbox::TargetPolicy* policy = runner.GetPolicy();
+
+  if (enable_mitigation) {
+    EXPECT_EQ(policy->SetDelayedProcessMitigations(which_mitigation),
+              sandbox::SBOX_ALL_OK);
+  }
+
+  base::string16 shared =
+      (which_mitigation == sandbox::MITIGATION_DYNAMIC_CODE_DISABLE)
+          ? L"TestWin81DynamicCode "
+          : L"TestWin10DynamicCodeWithOptOut ";
+  if (which_mitigation ==
+      sandbox::MITIGATION_DYNAMIC_CODE_DISABLE_WITH_OPT_OUT) {
+    shared += (with_thread_opt_out) ? L"true" : L"false";
+  }
+
+  // Test 1:
+  base::string16 test =
+      base::StringPrintf(L"%ls %u", shared.c_str(), VIRTUALALLOC);
+  EXPECT_EQ((expect_success ? sandbox::SBOX_TEST_SUCCEEDED
+                            : ERROR_DYNAMIC_CODE_BLOCKED),
+            runner.RunTest(test.c_str()));
+
+  // Test 2:
+  test = base::StringPrintf(L"%ls %u", shared.c_str(), VIRTUALPROTECT);
+  EXPECT_EQ((expect_success ? sandbox::SBOX_TEST_SUCCEEDED
+                            : ERROR_DYNAMIC_CODE_BLOCKED),
+            runner.RunTest(test.c_str()));
+
+  // Test 3:
+  // Need token level >= USER_LIMITED to be able to successfully run test 3.
+  policy->SetTokenLevel(sandbox::TokenLevel::USER_RESTRICTED_SAME_ACCESS,
+                        sandbox::TokenLevel::USER_LIMITED);
+
+  test = base::StringPrintf(L"%ls %u", shared.c_str(), MAPVIEWCUSTOM);
+  EXPECT_EQ((expect_success ? sandbox::SBOX_TEST_SUCCEEDED
+                            : ERROR_DYNAMIC_CODE_BLOCKED),
+            runner.RunTest(test.c_str()));
+
+  // Test 4:
+  // Set token levels back to default.
+  policy->SetTokenLevel(sandbox::TokenLevel::USER_RESTRICTED_SAME_ACCESS,
+                        sandbox::TokenLevel::USER_LOCKDOWN);
+
+  // Ensure sandbox access to the file on disk.
+  base::FilePath dll_path;
+  EXPECT_TRUE(base::PathService::Get(base::DIR_EXE, &dll_path));
+  dll_path = dll_path.Append(hooking_dll::g_hook_dll_file);
+
+  EXPECT_TRUE(runner.AddFsRule(sandbox::TargetPolicy::FILES_ALLOW_ANY,
+                               dll_path.value().c_str()));
+
+  test = base::StringPrintf(L"%ls %u \"%ls\"", shared.c_str(), MAPVIEWFILE,
+                            dll_path.value().c_str());
+  EXPECT_EQ((expect_success ? sandbox::SBOX_TEST_SUCCEEDED
+                            : ERROR_DYNAMIC_CODE_BLOCKED),
+            runner.RunTest(test.c_str()));
+}
+
+}  // namespace
+
+namespace sandbox {
+
+//------------------------------------------------------------------------------
+// Exported functions called by child test processes.
+//------------------------------------------------------------------------------
+
+// Parse arguments and do the test.
+//
+// - Arg1 is a DynCodeAPI indicating which API to test.
+// - [OPTIONAL] If Arg1 is MAPVIEWFILE, Arg2 is a file path to map.
+SBOX_TESTS_COMMAND int TestWin81DynamicCode(int argc, wchar_t** argv) {
+  if (argc < 1 || argv[0] == nullptr)
+    return SBOX_TEST_INVALID_PARAMETER;
+
+  // Arg1
+  int test = ::_wtoi(argv[0]);
+  if (test <= 0 || test >= NOTSUPPORTED)
+    return SBOX_TEST_INVALID_PARAMETER;
+
+  // [OPTIONAL] Arg2
+  wchar_t* path = nullptr;
+  if (argc > 1)
+    path = argv[1];
+
+  return DynamicCodeTest(static_cast<DynCodeAPI>(test), path);
+}
+
+// Parse arguments and spawn the test thread.
+//
+// - Arg1 is a bool indicating whether to opt-out the test thread.
+// - Arg2 is a DynCodeAPI indicating which API to test.
+// - [OPTIONAL] If Arg2 is MAPVIEWFILE, Arg3 is a file path to map.
+SBOX_TESTS_COMMAND int TestWin10DynamicCodeWithOptOut(int argc,
+                                                      wchar_t** argv) {
+  if (argc < 2 || argv[0] == nullptr || argv[1] == nullptr)
+    return SBOX_TEST_INVALID_PARAMETER;
+
+  // Arg1
+  bool opt_out = false;
+  if (::wcsicmp(argv[0], L"true") == 0)
+    opt_out = true;
+
+  // Arg2
+  int test = ::_wtoi(argv[1]);
+  if (test <= 0 || test >= NOTSUPPORTED)
+    return SBOX_TEST_INVALID_PARAMETER;
+
+  // [OPTIONAL] Arg3
+  wchar_t* path = nullptr;
+  if (argc > 2)
+    path = argv[2];
+
+  // Spawn new thread and wait for it to finish!
+  DynamicCodeOptOutThread opt_out_thread(opt_out, static_cast<DynCodeAPI>(test),
+                                         path);
+  opt_out_thread.Start();
+  return opt_out_thread.Join();
+}
+
+//------------------------------------------------------------------------------
+// Exported Dynamic Code Tests
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+// Disable dynamic code (MITIGATION_DYNAMIC_CODE_DISABLE)
+// >= Win8.1
+//------------------------------------------------------------------------------
+
+// This test validates that setting the MITIGATION_DYNAMIC_CODE_DISABLE
+// mitigation enables the setting on a process.
+TEST(ProcessMitigationsTest, CheckWin81DynamicCodePolicySuccess) {
+  if (base::win::GetVersion() < base::win::VERSION_WIN8_1)
+    return;
+
+  base::string16 test_command = L"CheckPolicy ";
+  test_command += std::to_wstring(TESTPOLICY_DYNAMICCODE);
+
+//---------------------------------
+// 1) Test setting pre-startup.
+// **Currently only running pre-startup in release.  Due to the sandbox in the
+// child using dynamic code for hooks, calls to "dynamic code APIs" are
+// failing... silently in release, but assert/breakpoint in debug.  Since
+// this test is only to check the policy setting, ignoring the failures is ok.
+//---------------------------------
+#if defined(NDEBUG)
+  TestRunner runner;
+  sandbox::TargetPolicy* policy = runner.GetPolicy();
+
+  EXPECT_EQ(policy->SetProcessMitigations(MITIGATION_DYNAMIC_CODE_DISABLE),
+            SBOX_ALL_OK);
+  EXPECT_EQ(SBOX_TEST_SUCCEEDED, runner.RunTest(test_command.c_str()));
+#endif  // defined(NDEBUG)
+  //---------------------------------
+  // 2) Test setting post-startup.
+  //---------------------------------
+  TestRunner runner2;
+  sandbox::TargetPolicy* policy2 = runner2.GetPolicy();
+
+  EXPECT_EQ(
+      policy2->SetDelayedProcessMitigations(MITIGATION_DYNAMIC_CODE_DISABLE),
+      SBOX_ALL_OK);
+  EXPECT_EQ(SBOX_TEST_SUCCEEDED, runner2.RunTest(test_command.c_str()));
+}
+
+// This test validates that we can meddle with dynamic code if the
+// MITIGATION_DYNAMIC_CODE_DISABLE mitigation is NOT set.
+TEST(ProcessMitigationsTest, CheckWin81DynamicCode_BaseCase) {
+  if (base::win::GetVersion() < base::win::VERSION_WIN8_1)
+    return;
+
+  HANDLE mutex = ::CreateMutexW(NULL, FALSE, hooking_dll::g_hooking_dll_mutex);
+  EXPECT_TRUE(mutex != NULL);
+  EXPECT_EQ(WAIT_OBJECT_0,
+            ::WaitForSingleObject(mutex, SboxTestEventTimeout()));
+
+  // Expect success, no mitigation.
+  DynamicCodeTestHarness(sandbox::MITIGATION_DYNAMIC_CODE_DISABLE, true, false);
+
+  EXPECT_TRUE(::ReleaseMutex(mutex));
+  EXPECT_TRUE(::CloseHandle(mutex));
+}
+
+// This test validates that setting the MITIGATION_DYNAMIC_CODE_DISABLE
+// mitigation prevents meddling with dynamic code.
+TEST(ProcessMitigationsTest, CheckWin81DynamicCode_TestMitigation) {
+  if (base::win::GetVersion() < base::win::VERSION_WIN8_1)
+    return;
+
+  HANDLE mutex = ::CreateMutexW(NULL, FALSE, hooking_dll::g_hooking_dll_mutex);
+  EXPECT_TRUE(mutex != NULL);
+  EXPECT_EQ(WAIT_OBJECT_0,
+            ::WaitForSingleObject(mutex, SboxTestEventTimeout()));
+
+  // Expect failure, with mitigation.
+  DynamicCodeTestHarness(sandbox::MITIGATION_DYNAMIC_CODE_DISABLE, false, true);
+
+  EXPECT_TRUE(::ReleaseMutex(mutex));
+  EXPECT_TRUE(::CloseHandle(mutex));
+}
+
+//------------------------------------------------------------------------------
+// Disable dynamic code, with per-thread opt-out enabled
+// (MITIGATION_DYNAMIC_CODE_DISABLE_WITH_OPT_OUT).
+// >= Win10_RS1 (Anniversary)
+//------------------------------------------------------------------------------
+
+// This test validates that setting the
+// MITIGATION_DYNAMIC_CODE_DISABLE_WITH_OPT_OUT mitigation enables the setting
+// on a process.
+TEST(ProcessMitigationsTest, CheckWin10DynamicCodeOptOutPolicySuccess) {
+  if (base::win::GetVersion() < base::win::VERSION_WIN10_RS1)
+    return;
+
+  base::string16 test_command = L"CheckPolicy ";
+  test_command += std::to_wstring(TESTPOLICY_DYNAMICCODEOPTOUT);
+
+//---------------------------------
+// 1) Test setting pre-startup.
+// **Currently only running pre-startup in release.  Due to the sandbox in the
+// child using dynamic code for hooks, calls to "dynamic code APIs" are
+// failing... silently in release, but assert/breakpoint in debug.  Since
+// this test is only to check the policy setting, ignoring the failures is ok.
+//---------------------------------
+#if defined(NDEBUG)
+  TestRunner runner;
+  sandbox::TargetPolicy* policy = runner.GetPolicy();
+
+  EXPECT_EQ(policy->SetProcessMitigations(
+                MITIGATION_DYNAMIC_CODE_DISABLE_WITH_OPT_OUT),
+            SBOX_ALL_OK);
+  EXPECT_EQ(SBOX_TEST_SUCCEEDED, runner.RunTest(test_command.c_str()));
+#endif  // defined(NDEBUG)
+  //---------------------------------
+  // 2) Test setting post-startup.
+  //---------------------------------
+  TestRunner runner2;
+  sandbox::TargetPolicy* policy2 = runner2.GetPolicy();
+
+  EXPECT_EQ(policy2->SetDelayedProcessMitigations(
+                MITIGATION_DYNAMIC_CODE_DISABLE_WITH_OPT_OUT),
+            SBOX_ALL_OK);
+  EXPECT_EQ(SBOX_TEST_SUCCEEDED, runner2.RunTest(test_command.c_str()));
+}
+
+// This test validates that we CAN meddle with dynamic code if the
+// MITIGATION_DYNAMIC_CODE_DISABLE_WITH_OPT_OUT mitigation is NOT set.
+TEST(ProcessMitigationsTest, CheckWin10DynamicCodeOptOut_BaseCase) {
+  if (base::win::GetVersion() < base::win::VERSION_WIN10_RS1)
+    return;
+
+  HANDLE mutex = ::CreateMutexW(NULL, FALSE, hooking_dll::g_hooking_dll_mutex);
+  EXPECT_TRUE(mutex != NULL);
+  EXPECT_EQ(WAIT_OBJECT_0,
+            ::WaitForSingleObject(mutex, SboxTestEventTimeout()));
+
+  // Expect success, no mitigation (and therefore no thread opt-out).
+  DynamicCodeTestHarness(sandbox::MITIGATION_DYNAMIC_CODE_DISABLE_WITH_OPT_OUT,
+                         true, false, false);
+
+  EXPECT_TRUE(::ReleaseMutex(mutex));
+  EXPECT_TRUE(::CloseHandle(mutex));
+}
+
+// This test validates that setting the
+// MITIGATION_DYNAMIC_CODE_DISABLE_WITH_OPT_OUT mitigation BLOCKS meddling
+// with dynamic code.
+TEST(ProcessMitigationsTest, CheckWin10DynamicCodeOptOut_TestMitigation) {
+  if (base::win::GetVersion() < base::win::VERSION_WIN10_RS1)
+    return;
+
+  HANDLE mutex = ::CreateMutexW(NULL, FALSE, hooking_dll::g_hooking_dll_mutex);
+  EXPECT_TRUE(mutex != NULL);
+  EXPECT_EQ(WAIT_OBJECT_0,
+            ::WaitForSingleObject(mutex, SboxTestEventTimeout()));
+
+  // Expect failure, with mitigation, no thread opt-out.
+  DynamicCodeTestHarness(sandbox::MITIGATION_DYNAMIC_CODE_DISABLE_WITH_OPT_OUT,
+                         false, true, false);
+
+  EXPECT_TRUE(::ReleaseMutex(mutex));
+  EXPECT_TRUE(::CloseHandle(mutex));
+}
+
+// This test validates that setting the
+// MITIGATION_DYNAMIC_CODE_DISABLE_WITH_OPT_OUT mitigation AND using
+// thread-specific opt-out ALLOWS meddling with dynamic code.
+TEST(ProcessMitigationsTest,
+     CheckWin10DynamicCodeOptOut_TestMitigationWithOptOut) {
+  if (base::win::GetVersion() < base::win::VERSION_WIN10_RS1)
+    return;
+
+  HANDLE mutex = ::CreateMutexW(NULL, FALSE, hooking_dll::g_hooking_dll_mutex);
+  EXPECT_TRUE(mutex != NULL);
+  EXPECT_EQ(WAIT_OBJECT_0,
+            ::WaitForSingleObject(mutex, SboxTestEventTimeout()));
+
+  // Expect success, with mitigation, with thread opt-out.
+  DynamicCodeTestHarness(sandbox::MITIGATION_DYNAMIC_CODE_DISABLE_WITH_OPT_OUT,
+                         true, true, true);
+
+  EXPECT_TRUE(::ReleaseMutex(mutex));
+  EXPECT_TRUE(::CloseHandle(mutex));
+}
+
+}  // namespace sandbox
diff --git a/sandbox/win/src/process_mitigations_imageload_unittest.cc b/sandbox/win/src/process_mitigations_imageload_unittest.cc
index 41c652e..20da157 100644
--- a/sandbox/win/src/process_mitigations_imageload_unittest.cc
+++ b/sandbox/win/src/process_mitigations_imageload_unittest.cc
@@ -16,6 +16,7 @@
 #include "sandbox/win/src/sandbox.h"
 #include "sandbox/win/src/target_services.h"
 #include "sandbox/win/tests/common/controller.h"
+#include "sandbox/win/tests/integration_tests/hijack_dlls.h"
 #include "sandbox/win/tests/integration_tests/integration_tests_common.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -25,6 +26,10 @@
 // Internal Defines & Functions
 //------------------------------------------------------------------------------
 
+// hijack_shim_dll defines
+using CheckHijackResultFunction = decltype(&hijack_dlls::CheckHijackResult);
+constexpr char g_hijack_shim_func[] = "CheckHijackResult";
+
 //------------------------------------------------------------------------------
 // ImageLoadRemote test helper function.
 //
@@ -121,11 +126,108 @@
             runner.RunTest(test.c_str()));
 }
 
+//------------------------------------------------------------------------------
+// ImageLoadPreferSystem32 test helper function.
+//
+// - Acquire the global g_hijack_dlls_mutex mutex before calling
+//   (as we meddle with a shared system resource).
+// - Note: Do not use ASSERTs in this function, as a global mutex is held.
+//
+// 1. Put a copy of the hijack DLL into system32.
+// 2. Trigger test child process (with or without mitigation enabled).  When
+//    the OS resolves the import table for the child process, it will either
+//    choose the version in the local app directory, or the copy in system32.
+//------------------------------------------------------------------------------
+void TestWin10ImageLoadPreferSys32(bool is_success_test) {
+  // Put a copy of the hijack dll into system32.  So there's one in the
+  // local dir, and one in system32.
+  base::FilePath app_path;
+  EXPECT_TRUE(base::PathService::Get(base::DIR_EXE, &app_path));
+  base::FilePath old_dll_path = app_path.Append(hijack_dlls::g_hijack_dll_file);
+
+  base::FilePath sys_path;
+  EXPECT_TRUE(base::PathService::Get(base::DIR_SYSTEM, &sys_path));
+  base::FilePath new_dll_path = sys_path.Append(hijack_dlls::g_hijack_dll_file);
+
+  // Note: test requires admin to copy/delete files in system32.
+  EXPECT_TRUE(base::CopyFileW(old_dll_path, new_dll_path));
+  // Do not ASSERT after this point.  Cleanup required.
+
+  sandbox::TestRunner runner;
+  sandbox::TargetPolicy* policy = runner.GetPolicy();
+
+  // ACCESS_DENIED errors loading DLLs without a higher token - AddFsRule
+  // doesn't cut it.
+  policy->SetTokenLevel(sandbox::TokenLevel::USER_RESTRICTED_SAME_ACCESS,
+                        sandbox::TokenLevel::USER_LIMITED);
+
+  if (!is_success_test) {
+    // Enable the PreferSystem32 mitigation.
+    EXPECT_EQ(policy->SetDelayedProcessMitigations(
+                  sandbox::MITIGATION_IMAGE_LOAD_PREFER_SYS32),
+              sandbox::SBOX_ALL_OK);
+  }
+
+  // Get path for the test shim DLL to pass along.
+  base::FilePath shim_dll_path =
+      app_path.Append(hijack_dlls::g_hijack_shim_dll_file);
+
+  // If this is the "success" test, expect a return value of "false" - as the
+  // hijack was successful so the hijack_dll is NOT in system32.
+  // The failure case has the mitigation enabled, so expect the hijack_dll to be
+  // in system32.
+  base::string16 test = base::StringPrintf(
+      L"%ls %ls \"%ls\"", L"TestImageLoadHijack",
+      (!is_success_test) ? L"true" : L"false", shim_dll_path.value().c_str());
+
+  EXPECT_EQ((is_success_test ? sandbox::SBOX_TEST_SUCCEEDED
+                             : sandbox::SBOX_TEST_FAILED),
+            runner.RunTest(test.c_str()));
+
+  EXPECT_TRUE(base::DeleteFileW(new_dll_path, false));
+}
+
 }  // namespace
 
 namespace sandbox {
 
 //------------------------------------------------------------------------------
+// Exported functions called by child test processes.
+//------------------------------------------------------------------------------
+
+// This test loading and using the shim DLL is required.
+// The waterfall bots (test environment/harness) have unique resource
+// access failures if the main sbox_integration_tests executable
+// implicitely links against the hijack DLL (and implicit linking is required
+// to test this mitigation) - regardless of whether this test runs or is
+// disabled.
+//
+// - Arg1: "true" or "false", if the DLL path should be in system32.
+// - Arg2: the full path to the test shim DLL to load.
+SBOX_TESTS_COMMAND int TestImageLoadHijack(int argc, wchar_t** argv) {
+  if (argc < 2 || argv[0] == nullptr || argv[1] == nullptr)
+    return SBOX_TEST_INVALID_PARAMETER;
+
+  bool expect_system = false;
+  if (::wcsicmp(argv[0], L"true") == 0)
+    expect_system = true;
+
+  // Load the shim DLL for this test.
+  base::ScopedNativeLibrary shim_dll((base::FilePath(argv[1])));
+  if (!shim_dll.is_valid())
+    return SBOX_TEST_NOT_FOUND;
+
+  CheckHijackResultFunction check_hijack_result =
+      reinterpret_cast<CheckHijackResultFunction>(
+          shim_dll.GetFunctionPointer(g_hijack_shim_func));
+
+  if (check_hijack_result == nullptr)
+    return SBOX_TEST_NOT_FOUND;
+
+  return check_hijack_result(expect_system);
+}
+
+//------------------------------------------------------------------------------
 // Exported Image Load Tests
 //------------------------------------------------------------------------------
 
@@ -245,4 +347,80 @@
   TestWin10ImageLoadLowLabel(false);
 }
 
+//------------------------------------------------------------------------------
+// Prefer system32 directory on image load (MITIGATION_IMAGE_LOAD_PREFER_SYS32).
+// >= Win10_RS1 (Anniversary)
+//------------------------------------------------------------------------------
+
+// This test validates that setting the MITIGATION_IMAGE_LOAD_PREFER_SYS32
+// mitigation enables the setting on a process.
+TEST(ProcessMitigationsTest, CheckWin10ImageLoadPreferSys32PolicySuccess) {
+  if (base::win::GetVersion() < base::win::VERSION_WIN10_RS1)
+    return;
+
+  base::string16 test_command = L"CheckPolicy ";
+  test_command += std::to_wstring(TESTPOLICY_LOADPREFERSYS32);
+
+  //---------------------------------
+  // 1) Test setting pre-startup.
+  //---------------------------------
+  TestRunner runner;
+  sandbox::TargetPolicy* policy = runner.GetPolicy();
+
+  EXPECT_EQ(policy->SetProcessMitigations(MITIGATION_IMAGE_LOAD_PREFER_SYS32),
+            SBOX_ALL_OK);
+  EXPECT_EQ(SBOX_TEST_SUCCEEDED, runner.RunTest(test_command.c_str()));
+
+  //---------------------------------
+  // 2) Test setting post-startup.
+  //---------------------------------
+  TestRunner runner2;
+  sandbox::TargetPolicy* policy2 = runner2.GetPolicy();
+
+  EXPECT_EQ(
+      policy2->SetDelayedProcessMitigations(MITIGATION_IMAGE_LOAD_PREFER_SYS32),
+      SBOX_ALL_OK);
+  EXPECT_EQ(SBOX_TEST_SUCCEEDED, runner2.RunTest(test_command.c_str()));
+}
+
+// This test validates that import hijacking succeeds, if the
+// MITIGATION_IMAGE_LOAD_PREFER_SYS32 mitigation is NOT set.
+//
+// Must run this test as admin/elevated.
+TEST(ProcessMitigationsTest, CheckWin10ImageLoadPreferSys32_Success) {
+  if (base::win::GetVersion() < base::win::VERSION_WIN10_RS1)
+    return;
+
+  HANDLE mutex = ::CreateMutexW(NULL, FALSE, hijack_dlls::g_hijack_dlls_mutex);
+  EXPECT_TRUE(mutex != NULL);
+  EXPECT_EQ(WAIT_OBJECT_0,
+            ::WaitForSingleObject(mutex, SboxTestEventTimeout()));
+
+  // Expect the DLL to be in system32.
+  TestWin10ImageLoadPreferSys32(true);
+
+  EXPECT_TRUE(::ReleaseMutex(mutex));
+  EXPECT_TRUE(::CloseHandle(mutex));
+}
+
+// This test validates that setting the MITIGATION_IMAGE_LOAD_PREFER_SYS32
+// mitigation prevents import hijacking.
+//
+// Must run this test as admin/elevated.
+TEST(ProcessMitigationsTest, CheckWin10ImageLoadPreferSys32_Failure) {
+  if (base::win::GetVersion() < base::win::VERSION_WIN10_RS1)
+    return;
+
+  HANDLE mutex = ::CreateMutexW(NULL, FALSE, hijack_dlls::g_hijack_dlls_mutex);
+  EXPECT_TRUE(mutex != NULL);
+  EXPECT_EQ(WAIT_OBJECT_0,
+            ::WaitForSingleObject(mutex, SboxTestEventTimeout()));
+
+  // Expect the DLL to NOT be in system32.
+  TestWin10ImageLoadPreferSys32(false);
+
+  EXPECT_TRUE(::ReleaseMutex(mutex));
+  EXPECT_TRUE(::CloseHandle(mutex));
+}
+
 }  // namespace sandbox
diff --git a/sandbox/win/src/process_mitigations_unittest.cc b/sandbox/win/src/process_mitigations_unittest.cc
index e41ccd4..6ffb919 100644
--- a/sandbox/win/src/process_mitigations_unittest.cc
+++ b/sandbox/win/src/process_mitigations_unittest.cc
@@ -14,6 +14,7 @@
 #include "sandbox/win/src/nt_internals.h"
 #include "sandbox/win/src/target_services.h"
 #include "sandbox/win/tests/common/controller.h"
+#include "sandbox/win/tests/integration_tests/hooking_dll.h"
 #include "sandbox/win/tests/integration_tests/integration_tests_common.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -68,6 +69,54 @@
             runner.RunTest(test_command.c_str()));
 }
 
+//------------------------------------------------------------------------------
+// ForceMsSigned test helper function.
+// - LoadLibrary fails with ERROR_INVALID_IMAGE_HASH if this mitigation is
+//   enabled and the target is not appropriately signed.
+// - Acquire the global g_hooking_dll_mutex mutex before calling
+//   (as we meddle with a shared system resource).
+// - Note: Do not use ASSERTs in this function, as a global mutex is held.
+//
+// Trigger test child process (with or without mitigation enabled).
+//------------------------------------------------------------------------------
+void TestWin10MsSigned(bool expect_success,
+                       bool enable_mitigation,
+                       bool use_ms_signed_binary) {
+  sandbox::TestRunner runner;
+  sandbox::TargetPolicy* policy = runner.GetPolicy();
+
+  if (enable_mitigation) {
+    // Enable the ForceMsSigned mitigation.
+    EXPECT_EQ(policy->SetDelayedProcessMitigations(
+                  sandbox::MITIGATION_FORCE_MS_SIGNED_BINS),
+              sandbox::SBOX_ALL_OK);
+  }
+
+  // Choose the appropriate DLL and make sure the sandbox allows access to it.
+  base::FilePath dll_path;
+  if (use_ms_signed_binary) {
+    EXPECT_TRUE(PathService::Get(base::DIR_SYSTEM, &dll_path));
+    dll_path = dll_path.Append(L"gdi32.dll");
+  } else {
+    EXPECT_TRUE(PathService::Get(base::DIR_EXE, &dll_path));
+    dll_path = dll_path.Append(hooking_dll::g_hook_dll_file);
+  }
+  EXPECT_TRUE(runner.AddFsRule(sandbox::TargetPolicy::FILES_ALLOW_READONLY,
+                               dll_path.value().c_str()));
+
+  // Set up test string.
+  base::string16 test = L"TestDllLoad \"";
+  test += dll_path.value().c_str();
+  test += L"\"";
+
+  // Note: ERROR_INVALID_IMAGE_HASH is being displayed in a system pop-up when
+  //       the DLL load is attempted, but the value returned from the test
+  //       process itself is SBOX_TEST_FAILED.
+  EXPECT_EQ((expect_success ? sandbox::SBOX_TEST_SUCCEEDED
+                            : sandbox::SBOX_TEST_FAILED),
+            runner.RunTest(test.c_str()));
+}
+
 }  // namespace
 
 namespace sandbox {
@@ -118,13 +167,13 @@
     // MITIGATION_RELOCATE_IMAGE_REQUIRED
     //--------------------------------------------------
     case (TESTPOLICY_ASLR): {
-      PROCESS_MITIGATION_ASLR_POLICY policy2 = {};
+      PROCESS_MITIGATION_ASLR_POLICY policy = {};
       if (!get_process_mitigation_policy(::GetCurrentProcess(),
-                                         ProcessASLRPolicy, &policy2,
-                                         sizeof(policy2))) {
+                                         ProcessASLRPolicy, &policy,
+                                         sizeof(policy))) {
         return SBOX_TEST_NOT_FOUND;
       }
-      if (!policy2.EnableForceRelocateImages || !policy2.DisallowStrippedImages)
+      if (!policy.EnableForceRelocateImages || !policy.DisallowStrippedImages)
         return SBOX_TEST_FAILED;
 
       break;
@@ -133,14 +182,14 @@
     // MITIGATION_STRICT_HANDLE_CHECKS
     //--------------------------------------------------
     case (TESTPOLICY_STRICTHANDLE): {
-      PROCESS_MITIGATION_STRICT_HANDLE_CHECK_POLICY policy3 = {};
+      PROCESS_MITIGATION_STRICT_HANDLE_CHECK_POLICY policy = {};
       if (!get_process_mitigation_policy(::GetCurrentProcess(),
                                          ProcessStrictHandleCheckPolicy,
-                                         &policy3, sizeof(policy3))) {
+                                         &policy, sizeof(policy))) {
         return SBOX_TEST_NOT_FOUND;
       }
-      if (!policy3.RaiseExceptionOnInvalidHandleReference ||
-          !policy3.HandleExceptionsPermanentlyEnabled) {
+      if (!policy.RaiseExceptionOnInvalidHandleReference ||
+          !policy.HandleExceptionsPermanentlyEnabled) {
         return SBOX_TEST_FAILED;
       }
 
@@ -177,6 +226,21 @@
       break;
     }
     //--------------------------------------------------
+    // MITIGATION_DYNAMIC_CODE_DISABLE
+    //--------------------------------------------------
+    case (TESTPOLICY_DYNAMICCODE): {
+      PROCESS_MITIGATION_DYNAMIC_CODE_POLICY policy = {};
+      if (!get_process_mitigation_policy(::GetCurrentProcess(),
+                                         ProcessDynamicCodePolicy, &policy,
+                                         sizeof(policy))) {
+        return SBOX_TEST_NOT_FOUND;
+      }
+      if (!policy.ProhibitDynamicCode)
+        return SBOX_TEST_FAILED;
+
+      break;
+    }
+    //--------------------------------------------------
     // MITIGATION_NONSYSTEM_FONT_DISABLE
     //--------------------------------------------------
     case (TESTPOLICY_NONSYSFONT): {
@@ -192,6 +256,21 @@
       break;
     }
     //--------------------------------------------------
+    // MITIGATION_FORCE_MS_SIGNED_BINS
+    //--------------------------------------------------
+    case (TESTPOLICY_MSSIGNED): {
+      PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY policy = {};
+      if (!get_process_mitigation_policy(::GetCurrentProcess(),
+                                         ProcessSignaturePolicy, &policy,
+                                         sizeof(policy))) {
+        return SBOX_TEST_NOT_FOUND;
+      }
+      if (!policy.MicrosoftSignedOnly)
+        return SBOX_TEST_FAILED;
+
+      break;
+    }
+    //--------------------------------------------------
     // MITIGATION_IMAGE_LOAD_NO_REMOTE
     //--------------------------------------------------
     case (TESTPOLICY_LOADNOREMOTE): {
@@ -221,6 +300,36 @@
 
       break;
     }
+    //--------------------------------------------------
+    // MITIGATION_DYNAMIC_CODE_DISABLE_WITH_OPT_OUT
+    //--------------------------------------------------
+    case (TESTPOLICY_DYNAMICCODEOPTOUT): {
+      PROCESS_MITIGATION_DYNAMIC_CODE_POLICY policy = {};
+      if (!get_process_mitigation_policy(::GetCurrentProcess(),
+                                         ProcessDynamicCodePolicy, &policy,
+                                         sizeof(policy))) {
+        return SBOX_TEST_NOT_FOUND;
+      }
+      if (!policy.ProhibitDynamicCode || !policy.AllowThreadOptOut)
+        return SBOX_TEST_FAILED;
+
+      break;
+    }
+    //--------------------------------------------------
+    // MITIGATION_IMAGE_LOAD_PREFER_SYS32
+    //--------------------------------------------------
+    case (TESTPOLICY_LOADPREFERSYS32): {
+      PROCESS_MITIGATION_IMAGE_LOAD_POLICY policy = {};
+      if (!get_process_mitigation_policy(::GetCurrentProcess(),
+                                         ProcessImageLoadPolicy, &policy,
+                                         sizeof(policy))) {
+        return SBOX_TEST_NOT_FOUND;
+      }
+      if (!policy.PreferSystem32Images)
+        return SBOX_TEST_FAILED;
+
+      break;
+    }
     default:
       return SBOX_TEST_INVALID_PARAMETER;
   }
@@ -592,6 +701,114 @@
 }
 
 //------------------------------------------------------------------------------
+// Force MS Signed Binaries (MITIGATION_FORCE_MS_SIGNED_BINS)
+// >= Win10 TH2
+//
+// (Note: the signing options for "MS store-signed" and "MS, store, or WHQL"
+//  are not supported or tested by the sandbox at the moment.)
+//------------------------------------------------------------------------------
+
+// This test validates that setting the MITIGATION_FORCE_MS_SIGNED_BINS
+// mitigation enables the setting on a process.
+TEST(ProcessMitigationsTest, CheckWin10MsSignedPolicySuccess) {
+  if (base::win::GetVersion() < base::win::VERSION_WIN10_TH2)
+    return;
+
+  base::string16 test_command = L"CheckPolicy ";
+  test_command += std::to_wstring(TESTPOLICY_MSSIGNED);
+
+//---------------------------------
+// 1) Test setting post-startup.
+// **Only test if NOT component build, otherwise component DLLs are not signed
+//   by MS and prevent process setup.
+// **Only test post-startup, otherwise this test executable has dependencies
+//   on DLLs that are not signed by MS and they prevent process startup.
+//---------------------------------
+#if !defined(COMPONENT_BUILD)
+  TestRunner runner2;
+  sandbox::TargetPolicy* policy2 = runner2.GetPolicy();
+
+  EXPECT_EQ(
+      policy2->SetDelayedProcessMitigations(MITIGATION_FORCE_MS_SIGNED_BINS),
+      SBOX_ALL_OK);
+  EXPECT_EQ(SBOX_TEST_SUCCEEDED, runner2.RunTest(test_command.c_str()));
+#endif  // !defined(COMPONENT_BUILD)
+}
+
+// This test validates that we can load an unsigned DLL if the
+// MITIGATION_FORCE_MS_SIGNED_BINS mitigation is NOT set.
+TEST(ProcessMitigationsTest, CheckWin10MsSigned_Success) {
+  if (base::win::GetVersion() < base::win::VERSION_WIN10_TH2)
+    return;
+
+  HANDLE mutex = ::CreateMutexW(NULL, FALSE, hooking_dll::g_hooking_dll_mutex);
+  EXPECT_TRUE(mutex != NULL);
+  EXPECT_EQ(WAIT_OBJECT_0,
+            ::WaitForSingleObject(mutex, SboxTestEventTimeout()));
+
+  // Expect success; Do not enable mitigation; Use non MS-signed binary.
+  TestWin10MsSigned(true, false, false);
+
+  EXPECT_TRUE(::ReleaseMutex(mutex));
+  EXPECT_TRUE(::CloseHandle(mutex));
+}
+
+// This test validates that setting the MITIGATION_FORCE_MS_SIGNED_BINS
+// mitigation prevents the loading of an unsigned DLL.
+TEST(ProcessMitigationsTest, CheckWin10MsSigned_Failure) {
+  if (base::win::GetVersion() < base::win::VERSION_WIN10_TH2)
+    return;
+
+  HANDLE mutex = ::CreateMutexW(NULL, FALSE, hooking_dll::g_hooking_dll_mutex);
+  EXPECT_TRUE(mutex != NULL);
+  EXPECT_EQ(WAIT_OBJECT_0,
+            ::WaitForSingleObject(mutex, SboxTestEventTimeout()));
+
+  // Expect failure; Enable mitigation; Use non MS-signed binary.
+  TestWin10MsSigned(false, true, false);
+
+  EXPECT_TRUE(::ReleaseMutex(mutex));
+  EXPECT_TRUE(::CloseHandle(mutex));
+}
+
+// This test validates that we can load a signed Microsoft DLL if the
+// MITIGATION_FORCE_MS_SIGNED_BINS mitigation is NOT set.  Very basic
+// sanity test.
+TEST(ProcessMitigationsTest, CheckWin10MsSigned_MsBaseline) {
+  if (base::win::GetVersion() < base::win::VERSION_WIN10_TH2)
+    return;
+
+  HANDLE mutex = ::CreateMutexW(NULL, FALSE, hooking_dll::g_hooking_dll_mutex);
+  EXPECT_TRUE(mutex != NULL);
+  EXPECT_EQ(WAIT_OBJECT_0,
+            ::WaitForSingleObject(mutex, SboxTestEventTimeout()));
+
+  // Expect success; Do not enable mitigation; Use MS-signed binary.
+  TestWin10MsSigned(true, false, true);
+
+  EXPECT_TRUE(::ReleaseMutex(mutex));
+  EXPECT_TRUE(::CloseHandle(mutex));
+}
+
+// This test validates that setting the MITIGATION_FORCE_MS_SIGNED_BINS
+// mitigation still allows the load of an MS-signed DLL.
+TEST(ProcessMitigationsTest, CheckWin10MsSigned_MsSuccess) {
+  if (base::win::GetVersion() < base::win::VERSION_WIN10_TH2)
+    return;
+
+  HANDLE mutex = ::CreateMutexW(NULL, FALSE, hooking_dll::g_hooking_dll_mutex);
+  EXPECT_TRUE(mutex != NULL);
+  EXPECT_EQ(WAIT_OBJECT_0,
+            ::WaitForSingleObject(mutex, SboxTestEventTimeout()));
+
+  // Expect success; Enable mitigation; Use MS-signed binary.
+  TestWin10MsSigned(true, true, true);
+
+  EXPECT_TRUE(::ReleaseMutex(mutex));
+  EXPECT_TRUE(::CloseHandle(mutex));
+}
+
+//------------------------------------------------------------------------------
 // Disable child process creation.
 // - JobLevel <= JOB_LIMITED_USER (on < WIN10_TH2).
 // - JobLevel <= JOB_LIMITED_USER which also triggers setting
diff --git a/sandbox/win/src/security_level.h b/sandbox/win/src/security_level.h
index ecca64d..7786293 100644
--- a/sandbox/win/src/security_level.h
+++ b/sandbox/win/src/security_level.h
@@ -142,48 +142,59 @@
 
 // Permanently enables DEP for the target process. Corresponds to
 // PROCESS_CREATION_MITIGATION_POLICY_DEP_ENABLE.
-const MitigationFlags MITIGATION_DEP                              = 0x00000001;
+const MitigationFlags MITIGATION_DEP = 0x00000001;
 
 // Permanently Disables ATL thunk emulation when DEP is enabled. Valid
 // only when MITIGATION_DEP is passed. Corresponds to not passing
 // PROCESS_CREATION_MITIGATION_POLICY_DEP_ATL_THUNK_ENABLE.
-const MitigationFlags MITIGATION_DEP_NO_ATL_THUNK                 = 0x00000002;
+const MitigationFlags MITIGATION_DEP_NO_ATL_THUNK = 0x00000002;
 
 // Enables Structured exception handling override prevention. Must be
 // enabled prior to process start. Corresponds to
 // PROCESS_CREATION_MITIGATION_POLICY_SEHOP_ENABLE.
-const MitigationFlags MITIGATION_SEHOP                            = 0x00000004;
+const MitigationFlags MITIGATION_SEHOP = 0x00000004;
 
 // Forces ASLR on all images in the child process. In debug builds, must be
 // enabled after startup. Corresponds to
 // PROCESS_CREATION_MITIGATION_POLICY_FORCE_RELOCATE_IMAGES_ALWAYS_ON .
-const MitigationFlags MITIGATION_RELOCATE_IMAGE                   = 0x00000008;
+const MitigationFlags MITIGATION_RELOCATE_IMAGE = 0x00000008;
 
 // Refuses to load DLLs that cannot support ASLR. In debug builds, must be
 // enabled after startup. Corresponds to
 // PROCESS_CREATION_MITIGATION_POLICY_FORCE_RELOCATE_IMAGES_ALWAYS_ON_REQ_RELOCS.
-const MitigationFlags MITIGATION_RELOCATE_IMAGE_REQUIRED          = 0x00000010;
+const MitigationFlags MITIGATION_RELOCATE_IMAGE_REQUIRED = 0x00000010;
 
 // Terminates the process on Windows heap corruption. Coresponds to
 // PROCESS_CREATION_MITIGATION_POLICY_HEAP_TERMINATE_ALWAYS_ON.
-const MitigationFlags MITIGATION_HEAP_TERMINATE                   = 0x00000020;
+const MitigationFlags MITIGATION_HEAP_TERMINATE = 0x00000020;
 
 // Sets a random lower bound as the minimum user address. Must be
 // enabled prior to process start. On 32-bit processes this is
 // emulated to a much smaller degree. Corresponds to
 // PROCESS_CREATION_MITIGATION_POLICY_BOTTOM_UP_ASLR_ALWAYS_ON.
-const MitigationFlags MITIGATION_BOTTOM_UP_ASLR                   = 0x00000040;
+const MitigationFlags MITIGATION_BOTTOM_UP_ASLR = 0x00000040;
 
 // Increases the randomness range of bottom-up ASLR to up to 1TB. Must be
 // enabled prior to process start and with MITIGATION_BOTTOM_UP_ASLR.
 // Corresponds to
 // PROCESS_CREATION_MITIGATION_POLICY_HIGH_ENTROPY_ASLR_ALWAYS_ON
-const MitigationFlags MITIGATION_HIGH_ENTROPY_ASLR                = 0x00000080;
+const MitigationFlags MITIGATION_HIGH_ENTROPY_ASLR = 0x00000080;
 
 // Immediately raises an exception on a bad handle reference. Must be
 // enabled after startup. Corresponds to
 // PROCESS_CREATION_MITIGATION_POLICY_STRICT_HANDLE_CHECKS_ALWAYS_ON.
-const MitigationFlags MITIGATION_STRICT_HANDLE_CHECKS             = 0x00000100;
+const MitigationFlags MITIGATION_STRICT_HANDLE_CHECKS = 0x00000100;
+
+// Sets the DLL search order to LOAD_LIBRARY_SEARCH_DEFAULT_DIRS. Additional
+// directories can be added via the Windows AddDllDirectory() function.
+// http://msdn.microsoft.com/en-us/library/windows/desktop/hh310515
+// Must be enabled after startup.
+const MitigationFlags MITIGATION_DLL_SEARCH_ORDER = 0x00000200;
+
+// Changes the mandatory integrity level policy on the current process' token
+// to enable no-read and no-execute up. This prevents a lower IL process from
+// opening the process token for impersonate/duplicate/assignment.
+const MitigationFlags MITIGATION_HARDEN_TOKEN_IL_POLICY = 0x00000400;
 
 // Prevents the process from making Win32k calls. Corresponds to
 // PROCESS_CREATION_MITIGATION_POLICY_WIN32K_SYSTEM_CALL_DISABLE_ALWAYS_ON.
@@ -192,40 +203,57 @@
 // setup, even if Win32k is not otherwise used. So they also need to add a rule
 // with SUBSYS_WIN32K_LOCKDOWN and semantics FAKE_USER_GDI_INIT to allow the
 // initialization to succeed.
-const MitigationFlags MITIGATION_WIN32K_DISABLE                   = 0x00000200;
+const MitigationFlags MITIGATION_WIN32K_DISABLE = 0x00000800;
 
 // Prevents certain built-in third party extension points from being used.
 // - App_Init DLLs
 // - Winsock Layered Service Providers (LSPs)
 // - Global Windows Hooks (NOT thread-targeted hooks)
-// - Legacy Input Method Editors (IMEs).
+// - Legacy Input Method Editors (IMEs)
 // I.e.: Disable legacy hooking mechanisms.  Corresponds to
 // PROCESS_CREATION_MITIGATION_POLICY_EXTENSION_POINT_DISABLE_ALWAYS_ON.
-const MitigationFlags MITIGATION_EXTENSION_POINT_DISABLE = 0x00000400;
+const MitigationFlags MITIGATION_EXTENSION_POINT_DISABLE = 0x00001000;
+
+// Prevents the process from generating dynamic code or modifying executable
+// code. Second option to allow thread-specific opt-out.
+// - VirtualAlloc with PAGE_EXECUTE_*
+// - VirtualProtect with PAGE_EXECUTE_*
+// - MapViewOfFile with FILE_MAP_EXECUTE | FILE_MAP_WRITE
+// - SetProcessValidCallTargets for CFG
+// Corresponds to
+// PROCESS_CREATION_MITIGATION_POLICY_PROHIBIT_DYNAMIC_CODE_ALWAYS_ON and
+// PROCESS_CREATION_MITIGATION_POLICY_PROHIBIT_DYNAMIC_CODE_ALWAYS_ON_ALLOW_OPT_OUT.
+const MitigationFlags MITIGATION_DYNAMIC_CODE_DISABLE = 0x00002000;
+const MitigationFlags MITIGATION_DYNAMIC_CODE_DISABLE_WITH_OPT_OUT = 0x00004000;
+// The following per-thread flag can be used with the
+// ApplyMitigationsToCurrentThread API.  Requires the above process mitigation
+// to be set on the current process.
+const MitigationFlags MITIGATION_DYNAMIC_CODE_OPT_OUT_THIS_THREAD = 0x00008000;
 
 // Prevents the process from loading non-system fonts into GDI.
 // Corresponds to
 // PROCESS_CREATION_MITIGATION_POLICY_FONT_DISABLE_ALWAYS_ON
-const MitigationFlags MITIGATION_NONSYSTEM_FONT_DISABLE = 0x00000800;
+const MitigationFlags MITIGATION_NONSYSTEM_FONT_DISABLE = 0x00010000;
 
-// Sets the DLL search order to LOAD_LIBRARY_SEARCH_DEFAULT_DIRS. Additional
-// directories can be added via the Windows AddDllDirectory() function.
-// http://msdn.microsoft.com/en-us/library/windows/desktop/hh310515
-// Must be enabled after startup.
-const MitigationFlags MITIGATION_DLL_SEARCH_ORDER        = 0x00000001ULL << 32;
-
-// Changes the mandatory integrity level policy on the current process' token
-// to enable no-read and no-execute up. This prevents a lower IL process from
-// opening the process token for impersonate/duplicate/assignment.
-const MitigationFlags MITIGATION_HARDEN_TOKEN_IL_POLICY  = 0x00000001ULL << 33;
+// Prevents the process from loading binaries NOT signed by MS.
+// Corresponds to
+// PROCESS_CREATION_MITIGATION_POLICY_BLOCK_NON_MICROSOFT_BINARIES_ALWAYS_ON
+const MitigationFlags MITIGATION_FORCE_MS_SIGNED_BINS = 0x00020000;
 
 // Blocks mapping of images from remote devices. Corresponds to
 // PROCESS_CREATION_MITIGATION_POLICY_IMAGE_LOAD_NO_REMOTE_ALWAYS_ON.
-const MitigationFlags MITIGATION_IMAGE_LOAD_NO_REMOTE = 0x00000001ULL << 52;
+const MitigationFlags MITIGATION_IMAGE_LOAD_NO_REMOTE = 0x00040000;
 
 // Blocks mapping of images that have the low manditory label. Corresponds to
 // PROCESS_CREATION_MITIGATION_POLICY_IMAGE_LOAD_NO_LOW_LABEL_ALWAYS_ON.
-const MitigationFlags MITIGATION_IMAGE_LOAD_NO_LOW_LABEL = 0x00000001ULL << 56;
+const MitigationFlags MITIGATION_IMAGE_LOAD_NO_LOW_LABEL = 0x00080000;
+
+// Forces image load preference to prioritize the Windows install System32
+// folder before dll load dir, application dir and any user dirs set.
+// - Affects IAT resolution standard search path only, NOT direct LoadLibrary or
+//   executable search path.
+// PROCESS_CREATION_MITIGATION_POLICY_IMAGE_LOAD_PREFER_SYSTEM32_ALWAYS_ON.
+const MitigationFlags MITIGATION_IMAGE_LOAD_PREFER_SYS32 = 0x00100000;
 
 }  // namespace sandbox
 
diff --git a/sandbox/win/tests/common/controller.h b/sandbox/win/tests/common/controller.h
index 1f9cc6d..133decd 100644
--- a/sandbox/win/tests/common/controller.h
+++ b/sandbox/win/tests/common/controller.h
@@ -102,7 +102,7 @@
   // Sets TestRunner to return without waiting for the process to exit.
   void SetAsynchronous(bool is_async) { is_async_ = is_async; }
 
-  // Sets TestRunner to return without waiting for the process to exit.
+  // Sets whether TestRunner sandboxes the child process. ("--no-sandbox")
   void SetUnsandboxed(bool is_no_sandbox) { no_sandbox_ = is_no_sandbox; }
 
   // Sets whether TestRunner should disable CSRSS or not (default true).
diff --git a/sandbox/win/tests/integration_tests/hijack_dll.cc b/sandbox/win/tests/integration_tests/hijack_dll.cc
new file mode 100644
index 0000000..5ea4c7b
--- /dev/null
+++ b/sandbox/win/tests/integration_tests/hijack_dll.cc
@@ -0,0 +1,22 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <windows.h>
+
+EXTERN_C IMAGE_DOS_HEADER __ImageBase;
+
+// Arg1: pointer to a buffer of size MAX_PATH + 1.
+bool GetPathOnDisk(wchar_t* buffer) {
+  if (buffer == nullptr)
+    return false;
+
+  if (::GetModuleFileNameW((HINSTANCE)&__ImageBase, buffer, MAX_PATH) == 0)
+    return false;
+
+  return true;
+}
+
+BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved) {
+  return TRUE;
+}
diff --git a/sandbox/win/tests/integration_tests/hijack_dll.def b/sandbox/win/tests/integration_tests/hijack_dll.def
new file mode 100644
index 0000000..c942068
--- /dev/null
+++ b/sandbox/win/tests/integration_tests/hijack_dll.def
@@ -0,0 +1,9 @@
+; Copyright 2017 The Chromium Authors. All rights reserved.
+; Use of this source code is governed by a BSD-style license that can be
+; found in the LICENSE file.
+
+LIBRARY  "sbox_integration_test_hijack_dll.dll"
+
+EXPORTS
+  GetPathOnDisk
+
diff --git a/sandbox/win/tests/integration_tests/hijack_dlls.h b/sandbox/win/tests/integration_tests/hijack_dlls.h
new file mode 100644
index 0000000..2896d7af
--- /dev/null
+++ b/sandbox/win/tests/integration_tests/hijack_dlls.h
@@ -0,0 +1,25 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef SANDBOX_TESTS_INTEGRATION_TESTS_HIJACK_DLLS_H_
+#define SANDBOX_TESTS_INTEGRATION_TESTS_HIJACK_DLLS_H_
+
+#include <windows.h>
+
+namespace hijack_dlls {
+
+constexpr wchar_t g_hijack_dll_file[] = L"sbox_integration_test_hijack_dll.dll";
+constexpr wchar_t g_hijack_shim_dll_file[] =
+    L"sbox_integration_test_hijack_shim_dll.dll";
+
+// System mutex to prevent conflicting tests from running at the same time.
+// This particular mutex is related to the use of the hijack dlls.
+constexpr wchar_t g_hijack_dlls_mutex[] = L"ChromeTestHijackDllsMutex";
+
+// Function definition for hijack shim dll.
+int CheckHijackResult(bool expect_system);
+
+}  // namespace hijack_dlls
+
+#endif  // SANDBOX_TESTS_INTEGRATION_TESTS_HIJACK_DLLS_H_
diff --git a/sandbox/win/tests/integration_tests/hijack_shim_dll.cc b/sandbox/win/tests/integration_tests/hijack_shim_dll.cc
new file mode 100644
index 0000000..0d762d0
--- /dev/null
+++ b/sandbox/win/tests/integration_tests/hijack_shim_dll.cc
@@ -0,0 +1,42 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <windows.h>
+
+#include "sandbox/win/tests/common/controller.h"
+
+// Function definition from hijack dll.
+bool GetPathOnDisk(wchar_t* buffer);
+
+// This shim implicitly links in the GetPathOnDisk function from the test
+// hijack DLL.  When this DLL is loaded, the loader resolves the
+// import using standard search path.  (The mitigation being tested affects the
+// standard search path.)  This test then calls the exported function to
+// determine which DLL on disk was loaded.
+//
+// Arg1: "true" or "false", if the DLL path should be in system32.
+int CheckHijackResult(bool expect_system) {
+  wchar_t dll_path[MAX_PATH + 1] = {};
+
+  // This should always succeed.
+  if (!GetPathOnDisk(dll_path))
+    return sandbox::SBOX_TEST_NOT_FOUND;
+
+  // Make sure the path is all one case.
+  for (size_t i = 0; dll_path[i]; i++)
+    dll_path[i] = ::towlower(dll_path[i]);
+
+  if (::wcsstr(dll_path, L"system32") == nullptr) {
+    // Not in system32.
+    return (expect_system) ? sandbox::SBOX_TEST_FAILED
+                           : sandbox::SBOX_TEST_SUCCEEDED;
+  }
+
+  return (!expect_system) ? sandbox::SBOX_TEST_FAILED
+                          : sandbox::SBOX_TEST_SUCCEEDED;
+}
+
+BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved) {
+  return TRUE;
+}
diff --git a/sandbox/win/tests/integration_tests/hooking_dll.h b/sandbox/win/tests/integration_tests/hooking_dll.h
index a52b7b4..18b7cb5 100644
--- a/sandbox/win/tests/integration_tests/hooking_dll.h
+++ b/sandbox/win/tests/integration_tests/hooking_dll.h
@@ -15,9 +15,13 @@
 
 namespace hooking_dll {
 
-constexpr wchar_t g_hook_dll_file[] = L"sbox_integration_test_hook_dll.dll";
+constexpr wchar_t g_hook_dll_file[] = L"sbox_integration_test_hooking_dll.dll";
 constexpr wchar_t g_hook_event[] = L"ChromeExtensionTestHookEvent";
 
+// System mutex to prevent conflicting tests from running at the same time.
+// This particular mutex is related to the use of the hooking_dll.
+constexpr wchar_t g_hooking_dll_mutex[] = L"ChromeTestHookingDllMutex";
+
 DLL_EXPORT void SetHook(HHOOK hook_handle);
 DLL_EXPORT bool WasHookCalled();
 DLL_EXPORT LRESULT HookProc(int code, WPARAM w_param, LPARAM l_param);
diff --git a/sandbox/win/tests/integration_tests/hooking_win_proc.h b/sandbox/win/tests/integration_tests/hooking_win_proc.h
index eb5e5e1e..f89f2ae 100644
--- a/sandbox/win/tests/integration_tests/hooking_win_proc.h
+++ b/sandbox/win/tests/integration_tests/hooking_win_proc.h
@@ -10,7 +10,7 @@
 namespace hooking_win_proc {
 
 constexpr wchar_t g_winproc_file[] = L"sbox_integration_test_win_proc.exe ";
-constexpr wchar_t g_winproc_event[] = L"ChromeExtensionTestEvent";
+constexpr wchar_t g_winproc_event[] = L"ChromeExtensionTestWinProcEvent";
 
 }  // namespace hooking_win_proc
 
diff --git a/sandbox/win/tests/integration_tests/integration_tests_common.h b/sandbox/win/tests/integration_tests/integration_tests_common.h
index 0c6eff1..74ead69 100644
--- a/sandbox/win/tests/integration_tests/integration_tests_common.h
+++ b/sandbox/win/tests/integration_tests/integration_tests_common.h
@@ -12,15 +12,20 @@
 //------------------------------------------------------------------------------
 // Common - for sharing between source files.
 //------------------------------------------------------------------------------
+
 enum TestPolicy {
   TESTPOLICY_DEP = 1,
   TESTPOLICY_ASLR,
   TESTPOLICY_STRICTHANDLE,
   TESTPOLICY_WIN32K,
   TESTPOLICY_EXTENSIONPOINT,
+  TESTPOLICY_DYNAMICCODE,
   TESTPOLICY_NONSYSFONT,
+  TESTPOLICY_MSSIGNED,
   TESTPOLICY_LOADNOREMOTE,
   TESTPOLICY_LOADNOLOW,
+  TESTPOLICY_DYNAMICCODEOPTOUT,
+  TESTPOLICY_LOADPREFERSYS32
 };
 
 // Timeout for ::WaitForSingleObject synchronization.
diff --git a/services/resource_coordinator/public/cpp/BUILD.gn b/services/resource_coordinator/public/cpp/BUILD.gn
index fda46f13..cf4d64c 100644
--- a/services/resource_coordinator/public/cpp/BUILD.gn
+++ b/services/resource_coordinator/public/cpp/BUILD.gn
@@ -18,6 +18,8 @@
     "memory_instrumentation/os_metrics_win.cc",
     "memory_instrumentation/process_metrics_memory_dump_provider.cc",
     "memory_instrumentation/process_metrics_memory_dump_provider.h",
+    "memory_instrumentation/tracing_observer.cc",
+    "memory_instrumentation/tracing_observer.h",
     "resource_coordinator_features.cc",
     "resource_coordinator_features.h",
     "resource_coordinator_interface.cc",
diff --git a/services/resource_coordinator/public/cpp/memory_instrumentation/client_process_impl.cc b/services/resource_coordinator/public/cpp/memory_instrumentation/client_process_impl.cc
index 726739c..225acd64 100644
--- a/services/resource_coordinator/public/cpp/memory_instrumentation/client_process_impl.cc
+++ b/services/resource_coordinator/public/cpp/memory_instrumentation/client_process_impl.cc
@@ -7,16 +7,84 @@
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/single_thread_task_runner.h"
+#include "base/strings/pattern.h"
+#include "base/strings/string_piece.h"
 #include "base/synchronization/lock.h"
 #include "base/trace_event/memory_dump_request_args.h"
 #include "mojo/public/cpp/bindings/interface_request.h"
 #include "services/resource_coordinator/public/cpp/memory_instrumentation/coordinator.h"
 #include "services/resource_coordinator/public/cpp/memory_instrumentation/memory_instrumentation.h"
+#include "services/resource_coordinator/public/cpp/memory_instrumentation/tracing_observer.h"
 #include "services/resource_coordinator/public/interfaces/memory_instrumentation/memory_instrumentation.mojom.h"
 #include "services/service_manager/public/cpp/connector.h"
 
 namespace memory_instrumentation {
 
+namespace {
+
+void FillOsDumpFromProcessMemoryDump(
+    const base::trace_event::ProcessMemoryDump* pmd,
+    base::trace_event::MemoryDumpCallbackResult::OSMemDump* osDump) {
+  if (pmd->has_process_totals()) {
+    const base::trace_event::ProcessMemoryTotals* totals =
+        pmd->process_totals();
+    osDump->resident_set_kb = totals->resident_set_bytes() / 1024;
+    osDump->platform_private_footprint = totals->GetPlatformPrivateFootprint();
+  }
+}
+
+uint32_t GetDumpsSumKb(const std::string& pattern,
+                       const base::trace_event::ProcessMemoryDump* pmd) {
+  uint64_t sum = 0;
+  for (const auto& kv : pmd->allocator_dumps()) {
+    auto name = base::StringPiece(kv.first);
+    if (base::MatchPattern(name, pattern)) {
+      sum += kv.second->GetSizeInternal();
+    }
+  }
+  return sum / 1024;
+}
+
+void CreateDumpSummary(
+    const base::trace_event::ProcessMemoryDumpsMap& process_dumps,
+    base::trace_event::MemoryDumpCallbackResult* result) {
+  for (const auto& kv : process_dumps) {
+    base::ProcessId pid = kv.first;  // kNullProcessId for the current process.
+    const base::trace_event::ProcessMemoryDump* process_memory_dump =
+        kv.second.get();
+
+    // TODO(hjd): Transitional until we send the full PMD. See crbug.com/704203
+    if (pid == base::kNullProcessId) {
+      result->chrome_dump.malloc_total_kb =
+          GetDumpsSumKb("malloc", process_memory_dump);
+      result->chrome_dump.v8_total_kb =
+          GetDumpsSumKb("v8/*", process_memory_dump);
+
+      result->chrome_dump.command_buffer_total_kb =
+          GetDumpsSumKb("gpu/gl/textures/*", process_memory_dump);
+      result->chrome_dump.command_buffer_total_kb +=
+          GetDumpsSumKb("gpu/gl/buffers/*", process_memory_dump);
+      result->chrome_dump.command_buffer_total_kb +=
+          GetDumpsSumKb("gpu/gl/renderbuffers/*", process_memory_dump);
+
+      // partition_alloc reports sizes for both allocated_objects and
+      // partitions. The memory allocated_objects uses is a subset of
+      // the partitions memory so to avoid double counting we only
+      // count partitions memory.
+      result->chrome_dump.partition_alloc_total_kb =
+          GetDumpsSumKb("partition_alloc/partitions/*", process_memory_dump);
+      result->chrome_dump.blink_gc_total_kb =
+          GetDumpsSumKb("blink_gc", process_memory_dump);
+      FillOsDumpFromProcessMemoryDump(process_memory_dump, &result->os_dump);
+    } else {
+      auto& os_dump = result->extra_processes_dumps[pid];
+      FillOsDumpFromProcessMemoryDump(process_memory_dump, &os_dump);
+    }
+  }
+}
+
+}  // namespace
+
 // static
 void ClientProcessImpl::CreateInstance(const Config& config) {
   static ClientProcessImpl* instance = nullptr;
@@ -59,6 +127,10 @@
           &ClientProcessImpl::RequestGlobalMemoryDump_NoCallback,
           base::Unretained(this)),
       is_coordinator_process);
+
+  tracing_observer_ = base::MakeUnique<TracingObserver>(
+      base::trace_event::TraceLog::GetInstance(),
+      base::trace_event::MemoryDumpManager::GetInstance());
 }
 
 ClientProcessImpl::~ClientProcessImpl() {}
@@ -66,22 +138,50 @@
 void ClientProcessImpl::RequestProcessMemoryDump(
     const base::trace_event::MemoryDumpRequestArgs& args,
     const RequestProcessMemoryDumpCallback& callback) {
+  DCHECK(!callback.is_null());
   base::trace_event::MemoryDumpManager::GetInstance()->CreateProcessDump(
       args, base::Bind(&ClientProcessImpl::OnProcessMemoryDumpDone,
-                       base::Unretained(this), callback));
+                       base::Unretained(this), callback, args));
 }
 
 void ClientProcessImpl::OnProcessMemoryDumpDone(
     const RequestProcessMemoryDumpCallback& callback,
+    const base::trace_event::MemoryDumpRequestArgs& req_args,
     bool success,
     uint64_t dump_guid,
-    const base::Optional<base::trace_event::MemoryDumpCallbackResult>& result) {
+    const base::trace_event::ProcessMemoryDumpsMap& process_dumps) {
+  DCHECK(success || process_dumps.empty());
+  for (const auto& kv : process_dumps) {
+    base::ProcessId pid = kv.first;  // kNullProcessId for the current process.
+    base::trace_event::ProcessMemoryDump* process_memory_dump = kv.second.get();
+
+    // SUMMARY_ONLY dumps are just return the summarized result in the
+    // ProcessMemoryDumpCallback. These shouldn't be added to the trace to
+    // avoid confusing trace consumers.
+    if (req_args.dump_type != base::trace_event::MemoryDumpType::SUMMARY_ONLY) {
+      bool added_to_trace = tracing_observer_->AddDumpToTraceIfEnabled(
+          &req_args, pid, process_memory_dump);
+
+      success = success && added_to_trace;
+    }
+  }
+
   mojom::RawProcessMemoryDumpPtr process_memory_dump(
       mojom::RawProcessMemoryDump::New());
-  if (result) {
-    process_memory_dump->os_dump = result->os_dump;
-    process_memory_dump->chrome_dump = result->chrome_dump;
-    for (const auto& kv : result->extra_processes_dumps) {
+
+  // TODO(hjd): Transitional until we send the full PMD. See crbug.com/704203
+  // Don't try to fill the struct in detailed mode since it is hard to avoid
+  // double counting.
+  if (req_args.level_of_detail !=
+      base::trace_event::MemoryDumpLevelOfDetail::DETAILED) {
+    // The results struct to fill.
+    base::trace_event::MemoryDumpCallbackResult result;
+
+    CreateDumpSummary(process_dumps, &result);
+
+    process_memory_dump->os_dump = result.os_dump;
+    process_memory_dump->chrome_dump = result.chrome_dump;
+    for (const auto& kv : result.extra_processes_dumps) {
       const base::ProcessId pid = kv.first;
       const base::trace_event::MemoryDumpCallbackResult::OSMemDump&
           os_mem_dump = kv.second;
diff --git a/services/resource_coordinator/public/cpp/memory_instrumentation/client_process_impl.h b/services/resource_coordinator/public/cpp/memory_instrumentation/client_process_impl.h
index 0335f9f7..d409ec2 100644
--- a/services/resource_coordinator/public/cpp/memory_instrumentation/client_process_impl.h
+++ b/services/resource_coordinator/public/cpp/memory_instrumentation/client_process_impl.h
@@ -18,6 +18,8 @@
 
 namespace memory_instrumentation {
 
+class TracingObserver;
+
 // This is the bridge between MemoryDumpManager and the Coordinator service.
 // This indirection is needed to avoid a dependency from //base, where
 // MemoryDumpManager lives, to //services, where the Coordinator service lives.
@@ -65,9 +67,10 @@
   // Callback passed to base::MemoryDumpManager::CreateProcessDump().
   void OnProcessMemoryDumpDone(
       const RequestProcessMemoryDumpCallback&,
+      const base::trace_event::MemoryDumpRequestArgs& req_args,
       bool success,
       uint64_t dump_guid,
-      const base::Optional<base::trace_event::MemoryDumpCallbackResult>&);
+      const base::trace_event::ProcessMemoryDumpsMap&);
 
   // mojom::ClientProcess implementation. The Coordinator calls this.
   void RequestOSMemoryDump(
@@ -79,6 +82,10 @@
   const mojom::ProcessType process_type_;
   scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
 
+  // TODO(ssid): This should be moved to coordinator instead of clients once we
+  // have the whole chrome dumps sent via mojo, crbug.com/728199.
+  std::unique_ptr<TracingObserver> tracing_observer_;
+
   DISALLOW_COPY_AND_ASSIGN(ClientProcessImpl);
 };
 
diff --git a/services/resource_coordinator/public/cpp/memory_instrumentation/tracing_observer.cc b/services/resource_coordinator/public/cpp/memory_instrumentation/tracing_observer.cc
new file mode 100644
index 0000000..cd76a11d2
--- /dev/null
+++ b/services/resource_coordinator/public/cpp/memory_instrumentation/tracing_observer.cc
@@ -0,0 +1,120 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "services/resource_coordinator/public/cpp/memory_instrumentation/tracing_observer.h"
+
+#include "base/memory/ptr_util.h"
+#include "base/trace_event/memory_dump_manager.h"
+#include "base/trace_event/trace_event_argument.h"
+
+namespace memory_instrumentation {
+
+namespace {
+
+const int kTraceEventNumArgs = 1;
+const char* kTraceEventArgNames[] = {"dumps"};
+const unsigned char kTraceEventArgTypes[] = {TRACE_VALUE_TYPE_CONVERTABLE};
+
+bool IsMemoryInfraTracingEnabled() {
+  bool enabled;
+  TRACE_EVENT_CATEGORY_GROUP_ENABLED(
+      base::trace_event::MemoryDumpManager::kTraceCategory, &enabled);
+  return enabled;
+}
+
+};  // namespace
+
+TracingObserver::TracingObserver(
+    base::trace_event::TraceLog* trace_log,
+    base::trace_event::MemoryDumpManager* memory_dump_manager)
+    : memory_dump_manager_(memory_dump_manager), trace_log_(trace_log) {
+  // If tracing was enabled before initializing MemoryDumpManager, we missed the
+  // OnTraceLogEnabled() event. Synthesize it so we can late-join the party.
+  // IsEnabled is called before adding observer to avoid calling
+  // OnTraceLogEnabled twice.
+  bool is_tracing_already_enabled = trace_log_->IsEnabled();
+  trace_log_->AddEnabledStateObserver(this);
+  if (is_tracing_already_enabled)
+    OnTraceLogEnabled();
+}
+
+TracingObserver::~TracingObserver() {
+  trace_log_->RemoveEnabledStateObserver(this);
+}
+
+void TracingObserver::OnTraceLogEnabled() {
+  if (!IsMemoryInfraTracingEnabled())
+    return;
+
+  // Initialize the TraceLog for the current thread. This is to avoids that the
+  // TraceLog memory dump provider is registered lazily during the MDM
+  // SetupForTracing().
+  base::trace_event::TraceLog::GetInstance()
+      ->InitializeThreadLocalEventBufferIfSupported();
+
+  const base::trace_event::TraceConfig& trace_config =
+      base::trace_event::TraceLog::GetInstance()->GetCurrentTraceConfig();
+  const base::trace_event::TraceConfig::MemoryDumpConfig& memory_dump_config =
+      trace_config.memory_dump_config();
+
+  memory_dump_config_ =
+      base::MakeUnique<base::trace_event::TraceConfig::MemoryDumpConfig>(
+          memory_dump_config);
+
+  memory_dump_manager_->SetupForTracing(memory_dump_config);
+}
+
+void TracingObserver::OnTraceLogDisabled() {
+  memory_dump_manager_->TeardownForTracing();
+  memory_dump_config_.reset();
+}
+
+bool TracingObserver::AddDumpToTraceIfEnabled(
+    const base::trace_event::MemoryDumpRequestArgs* req_args,
+    const base::ProcessId pid,
+    const base::trace_event::ProcessMemoryDump* process_memory_dump) {
+  // If tracing has been disabled early out to avoid the cost of serializing the
+  // dump then ignoring the result.
+  if (!IsMemoryInfraTracingEnabled())
+    return false;
+  // If the dump mode is too detailed don't add to trace to avoid accidentally
+  // including PII.
+  if (!IsDumpModeAllowed(req_args->level_of_detail))
+    return false;
+
+  CHECK_NE(base::trace_event::MemoryDumpType::SUMMARY_ONLY,
+           req_args->dump_type);
+
+  const uint64_t dump_guid = req_args->dump_guid;
+
+  std::unique_ptr<base::trace_event::TracedValue> traced_value(
+      new base::trace_event::TracedValue);
+  process_memory_dump->AsValueInto(traced_value.get());
+  traced_value->SetString("level_of_detail",
+                          base::trace_event::MemoryDumpLevelOfDetailToString(
+                              req_args->level_of_detail));
+  const char* const event_name =
+      base::trace_event::MemoryDumpTypeToString(req_args->dump_type);
+
+  std::unique_ptr<base::trace_event::ConvertableToTraceFormat> event_value(
+      std::move(traced_value));
+  TRACE_EVENT_API_ADD_TRACE_EVENT_WITH_PROCESS_ID(
+      TRACE_EVENT_PHASE_MEMORY_DUMP,
+      base::trace_event::TraceLog::GetCategoryGroupEnabled(
+          base::trace_event::MemoryDumpManager::kTraceCategory),
+      event_name, trace_event_internal::kGlobalScope, dump_guid, pid,
+      kTraceEventNumArgs, kTraceEventArgNames, kTraceEventArgTypes,
+      nullptr /* arg_values */, &event_value, TRACE_EVENT_FLAG_HAS_ID);
+
+  return true;
+}
+
+bool TracingObserver::IsDumpModeAllowed(
+    base::trace_event::MemoryDumpLevelOfDetail dump_mode) const {
+  if (!memory_dump_config_)
+    return false;
+  return memory_dump_config_->allowed_dump_modes.count(dump_mode) != 0;
+}
+
+}  // namespace memory_instrumentation
diff --git a/services/resource_coordinator/public/cpp/memory_instrumentation/tracing_observer.h b/services/resource_coordinator/public/cpp/memory_instrumentation/tracing_observer.h
new file mode 100644
index 0000000..6aaf312
--- /dev/null
+++ b/services/resource_coordinator/public/cpp/memory_instrumentation/tracing_observer.h
@@ -0,0 +1,47 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef SERVICES_RESOURCE_COORDINATOR_PUBLIC_CPP_MEMORY_INSTRUMENTATION_TRACING_OBSERVER_H
+#define SERVICES_RESOURCE_COORDINATOR_PUBLIC_CPP_MEMORY_INSTRUMENTATION_TRACING_OBSERVER_H
+
+#include "base/macros.h"
+#include "base/trace_event/memory_dump_manager.h"
+#include "base/trace_event/trace_event.h"
+#include "services/resource_coordinator/public/cpp/resource_coordinator_export.h"
+
+namespace memory_instrumentation {
+
+// Observes TraceLog for Enable/Disable events and when they occur Enables and
+// Disables the MemoryDumpManager with the correct state based on reading the
+// trace log. Also provides a method for adding a dump to the trace.
+class SERVICES_RESOURCE_COORDINATOR_PUBLIC_CPP_EXPORT TracingObserver
+    : public base::trace_event::TraceLog::EnabledStateObserver {
+ public:
+  TracingObserver(base::trace_event::TraceLog*,
+                  base::trace_event::MemoryDumpManager*);
+  ~TracingObserver() override;
+
+  // TraceLog::EnabledStateObserver implementation.
+  void OnTraceLogEnabled() override;
+  void OnTraceLogDisabled() override;
+
+  bool AddDumpToTraceIfEnabled(const base::trace_event::MemoryDumpRequestArgs*,
+                               const base::ProcessId,
+                               const base::trace_event::ProcessMemoryDump*);
+
+ private:
+  // Returns true if the dump mode is allowed for current tracing session.
+  bool IsDumpModeAllowed(base::trace_event::MemoryDumpLevelOfDetail) const;
+
+  base::trace_event::MemoryDumpManager* const memory_dump_manager_;
+  base::trace_event::TraceLog* const trace_log_;
+  std::unique_ptr<base::trace_event::TraceConfig::MemoryDumpConfig>
+      memory_dump_config_;
+
+  DISALLOW_COPY_AND_ASSIGN(TracingObserver);
+};
+
+}  // namespace memory_instrumentation
+
+#endif  // SERVICES_RESOURCE_COORDINATOR_PUBLIC_CPP_MEMORY_INSTRUMENTATION_TRACING_OBSERVER_H
diff --git a/services/ui/common/BUILD.gn b/services/ui/common/BUILD.gn
index 94a8925..95b8497 100644
--- a/services/ui/common/BUILD.gn
+++ b/services/ui/common/BUILD.gn
@@ -10,6 +10,8 @@
   sources = [
     "accelerator_util.cc",
     "accelerator_util.h",
+    "image_cursors_set.cc",
+    "image_cursors_set.h",
     "switches.cc",
     "switches.h",
     "transient_window_utils.h",
diff --git a/services/ui/common/image_cursors_set.cc b/services/ui/common/image_cursors_set.cc
new file mode 100644
index 0000000..38b81f2
--- /dev/null
+++ b/services/ui/common/image_cursors_set.cc
@@ -0,0 +1,37 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "services/ui/common/image_cursors_set.h"
+
+#include <algorithm>
+
+#include "ui/base/cursor/image_cursors.h"
+
+namespace ui {
+
+ImageCursorsSet::ImageCursorsSet() : weak_ptr_factory_(this) {}
+
+ImageCursorsSet::~ImageCursorsSet() {}
+
+void ImageCursorsSet::AddImageCursors(
+    std::unique_ptr<ImageCursors> image_cursors) {
+  auto result = image_cursors_set_.insert(std::move(image_cursors));
+  DCHECK(result.second);
+}
+
+void ImageCursorsSet::DeleteImageCursors(ImageCursors* image_cursors) {
+  auto it =
+      std::find_if(image_cursors_set_.begin(), image_cursors_set_.end(),
+                   [image_cursors](const std::unique_ptr<ImageCursors>& elmt) {
+                     return elmt.get() == image_cursors;
+                   });
+  DCHECK(it != image_cursors_set_.end());
+  image_cursors_set_.erase(it);
+}
+
+base::WeakPtr<ImageCursorsSet> ImageCursorsSet::GetWeakPtr() {
+  return weak_ptr_factory_.GetWeakPtr();
+}
+
+}  // namespace ui
diff --git a/services/ui/common/image_cursors_set.h b/services/ui/common/image_cursors_set.h
new file mode 100644
index 0000000..8616cf8
--- /dev/null
+++ b/services/ui/common/image_cursors_set.h
@@ -0,0 +1,37 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef SERVICES_UI_COMMON_IMAGE_CURSORS_SET_H_
+#define SERVICES_UI_COMMON_IMAGE_CURSORS_SET_H_
+
+#include <memory>
+#include <set>
+
+#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
+
+namespace ui {
+
+class ImageCursors;
+
+// Helper class wrapping a set of ImageCursors objects.
+class ImageCursorsSet {
+ public:
+  ImageCursorsSet();
+  ~ImageCursorsSet();
+
+  void AddImageCursors(std::unique_ptr<ImageCursors> image_cursors);
+  void DeleteImageCursors(ImageCursors* image_cursors);
+  base::WeakPtr<ImageCursorsSet> GetWeakPtr();
+
+ private:
+  std::set<std::unique_ptr<ImageCursors>> image_cursors_set_;
+  base::WeakPtrFactory<ImageCursorsSet> weak_ptr_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(ImageCursorsSet);
+};
+
+}  // namespace ui
+
+#endif  // SERVICES_UI_COMMON_IMAGE_CURSORS_SET_H_
diff --git a/services/ui/display/screen_manager_forwarding.cc b/services/ui/display/screen_manager_forwarding.cc
index 1955edb..0c869fd 100644
--- a/services/ui/display/screen_manager_forwarding.cc
+++ b/services/ui/display/screen_manager_forwarding.cc
@@ -39,17 +39,20 @@
 
 }  // namespace
 
-ScreenManagerForwarding::ScreenManagerForwarding()
-    : screen_(base::MakeUnique<display::ScreenBase>()),
+ScreenManagerForwarding::ScreenManagerForwarding(Mode mode)
+    : is_in_process_(mode == Mode::IN_WM_PROCESS),
+      screen_(base::MakeUnique<display::ScreenBase>()),
       binding_(this),
       test_controller_binding_(this) {
-  Screen::SetScreenInstance(screen_.get());
+  if (!is_in_process_)
+    Screen::SetScreenInstance(screen_.get());
 }
 
 ScreenManagerForwarding::~ScreenManagerForwarding() {
   if (native_display_delegate_)
     native_display_delegate_->RemoveObserver(this);
-  Screen::SetScreenInstance(nullptr);
+  if (!is_in_process_)
+    Screen::SetScreenInstance(nullptr);
 }
 
 void ScreenManagerForwarding::AddInterfaces(
diff --git a/services/ui/display/screen_manager_forwarding.h b/services/ui/display/screen_manager_forwarding.h
index 40cca54..a397f29c 100644
--- a/services/ui/display/screen_manager_forwarding.h
+++ b/services/ui/display/screen_manager_forwarding.h
@@ -33,7 +33,14 @@
                                 public NativeDisplayObserver,
                                 public mojom::NativeDisplayDelegate {
  public:
-  ScreenManagerForwarding();
+  enum class Mode {
+    IN_WM_PROCESS,
+    OWN_PROCESS,
+  };
+
+  // |in_process|  is true if the UI Service runs inside WM's process, false if
+  // it runs inside its own process.
+  explicit ScreenManagerForwarding(Mode mode);
   ~ScreenManagerForwarding() override;
 
   // ScreenManager:
@@ -91,6 +98,9 @@
       const mojom::NativeDisplayDelegate::ConfigureCallback& callback,
       bool status);
 
+  // True if the UI Service runs inside WM's process, false if it runs inside
+  // its own process.
+  const bool is_in_process_;
   std::unique_ptr<display::ScreenBase> screen_;
   mojo::Binding<mojom::NativeDisplayDelegate> binding_;
   mojom::NativeDisplayObserverPtr observer_;
diff --git a/services/ui/gpu/gpu_main.cc b/services/ui/gpu/gpu_main.cc
index eda1068..88a8f96b 100644
--- a/services/ui/gpu/gpu_main.cc
+++ b/services/ui/gpu/gpu_main.cc
@@ -51,8 +51,15 @@
 GpuMain::GpuMain(mojom::GpuMainRequest request)
     : gpu_thread_("GpuThread"),
       io_thread_("GpuIOThread"),
-      power_monitor_(base::MakeUnique<base::PowerMonitorDeviceSource>()),
       binding_(this) {
+  // TODO: crbug.com/609317: Remove this when Mus Window Server and GPU are
+  // split into separate processes. Until then this is necessary to be able to
+  // run Mushrome (chrome --mus) with Mus running in the browser process.
+  if (!base::PowerMonitor::Get()) {
+    power_monitor_ = base::MakeUnique<base::PowerMonitor>(
+        base::MakeUnique<base::PowerMonitorDeviceSource>());
+  }
+
   base::Thread::Options thread_options;
 
 #if defined(OS_WIN)
diff --git a/services/ui/gpu/gpu_main.h b/services/ui/gpu/gpu_main.h
index 704fc6e..a1bd932 100644
--- a/services/ui/gpu/gpu_main.h
+++ b/services/ui/gpu/gpu_main.h
@@ -96,7 +96,7 @@
 
   scoped_refptr<base::SingleThreadTaskRunner> compositor_thread_task_runner_;
 
-  base::PowerMonitor power_monitor_;
+  std::unique_ptr<base::PowerMonitor> power_monitor_;
   mojo::Binding<mojom::GpuMain> binding_;
 
   DISALLOW_COPY_AND_ASSIGN(GpuMain);
diff --git a/services/ui/main.cc b/services/ui/main.cc
index faf3779..4592379e 100644
--- a/services/ui/main.cc
+++ b/services/ui/main.cc
@@ -8,7 +8,7 @@
 #include "services/ui/service.h"
 
 MojoResult ServiceMain(MojoHandle service_request_handle) {
-  service_manager::ServiceRunner runner(new ui::Service);
+  service_manager::ServiceRunner runner(new ui::Service());
   runner.set_message_loop_type(base::MessageLoop::TYPE_UI);
   return runner.Run(service_request_handle);
 }
diff --git a/services/ui/service.cc b/services/ui/service.cc
index 3113ce8..678f573 100644
--- a/services/ui/service.cc
+++ b/services/ui/service.cc
@@ -9,7 +9,6 @@
 #include "base/bind.h"
 #include "base/command_line.h"
 #include "base/memory/ptr_util.h"
-#include "base/memory/weak_ptr.h"
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/threading/platform_thread.h"
@@ -23,6 +22,7 @@
 #include "services/service_manager/public/cpp/connector.h"
 #include "services/service_manager/public/cpp/service_context.h"
 #include "services/ui/clipboard/clipboard_impl.h"
+#include "services/ui/common/image_cursors_set.h"
 #include "services/ui/common/switches.h"
 #include "services/ui/display/screen_manager.h"
 #include "services/ui/ime/ime_driver_bridge.h"
@@ -33,6 +33,8 @@
 #include "services/ui/ws/display_manager.h"
 #include "services/ui/ws/frame_sink_manager_client_binding.h"
 #include "services/ui/ws/gpu_host.h"
+#include "services/ui/ws/threaded_image_cursors.h"
+#include "services/ui/ws/threaded_image_cursors_factory.h"
 #include "services/ui/ws/user_activity_monitor.h"
 #include "services/ui/ws/user_display_manager.h"
 #include "services/ui/ws/window_server.h"
@@ -41,6 +43,7 @@
 #include "services/ui/ws/window_tree_binding.h"
 #include "services/ui/ws/window_tree_factory.h"
 #include "services/ui/ws/window_tree_host_factory.h"
+#include "ui/base/cursor/image_cursors.h"
 #include "ui/base/platform_window_defaults.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/base/ui_base_paths.h"
@@ -76,6 +79,48 @@
 const char kResourceFile100[] = "mus_app_resources_100.pak";
 const char kResourceFile200[] = "mus_app_resources_200.pak";
 
+class ThreadedImageCursorsFactoryImpl : public ws::ThreadedImageCursorsFactory {
+ public:
+  // Uses the same InProcessConfig as the UI Service. |config| will be null when
+  // the UI Service runs in it's own separate process as opposed to the WM's
+  // process.
+  explicit ThreadedImageCursorsFactoryImpl(
+      const Service::InProcessConfig* config) {
+    if (config) {
+      resource_runner_ = config->resource_runner;
+      image_cursors_set_weak_ptr_ = config->image_cursors_set_weak_ptr;
+      DCHECK(resource_runner_);
+    }
+  }
+
+  ~ThreadedImageCursorsFactoryImpl() override {}
+
+  // ws::ThreadedImageCursorsFactory:
+  std::unique_ptr<ws::ThreadedImageCursors> CreateCursors() override {
+    // |resource_runner_| will not be initialized if and only if UI Service runs
+    // in it's own separate process. In this case we can (lazily) initialize it
+    // to the current thread (i.e. the UI Services's thread). We also initialize
+    // the local |image_cursors_set_| and make |image_cursors_set_weak_ptr_|
+    // point to it.
+    if (!resource_runner_) {
+      resource_runner_ = base::ThreadTaskRunnerHandle::Get();
+      image_cursors_set_ = base::MakeUnique<ui::ImageCursorsSet>();
+      image_cursors_set_weak_ptr_ = image_cursors_set_->GetWeakPtr();
+    }
+    return base::MakeUnique<ws::ThreadedImageCursors>(
+        resource_runner_, image_cursors_set_weak_ptr_);
+  }
+
+ private:
+  scoped_refptr<base::SingleThreadTaskRunner> resource_runner_;
+  base::WeakPtr<ui::ImageCursorsSet> image_cursors_set_weak_ptr_;
+
+  // Used when UI Service doesn't run inside WM's process.
+  std::unique_ptr<ui::ImageCursorsSet> image_cursors_set_;
+
+  DISALLOW_COPY_AND_ASSIGN(ThreadedImageCursorsFactoryImpl);
+};
+
 }  // namespace
 
 // TODO(sky): this is a pretty typical pattern, make it easier to do.
@@ -91,7 +136,16 @@
   std::unique_ptr<ws::WindowTreeHostFactory> window_tree_host_factory;
 };
 
-Service::Service() : test_config_(false), ime_registrar_(&ime_driver_) {}
+Service::InProcessConfig::InProcessConfig() = default;
+
+Service::InProcessConfig::~InProcessConfig() = default;
+
+Service::Service(const InProcessConfig* config)
+    : is_in_process_(config != nullptr),
+      threaded_image_cursors_factory_(
+          base::MakeUnique<ThreadedImageCursorsFactoryImpl>(config)),
+      test_config_(false),
+      ime_registrar_(&ime_driver_) {}
 
 Service::~Service() {
   // Destroy |window_server_| first, since it depends on |event_source_|.
@@ -110,7 +164,7 @@
 }
 
 bool Service::InitializeResources(service_manager::Connector* connector) {
-  if (ui::ResourceBundle::HasSharedInstance())
+  if (is_in_process() || ui::ResourceBundle::HasSharedInstance())
     return true;
 
   std::set<std::string> resource_paths;
@@ -188,9 +242,12 @@
   // Assume a client will change the layout to an appropriate configuration.
   ui::KeyboardLayoutEngineManager::GetKeyboardLayoutEngine()
       ->SetCurrentLayoutByName("us");
-  client_native_pixmap_factory_ = ui::CreateClientNativePixmapFactoryOzone();
-  gfx::ClientNativePixmapFactory::SetInstance(
-      client_native_pixmap_factory_.get());
+
+  if (!is_in_process()) {
+    client_native_pixmap_factory_ = ui::CreateClientNativePixmapFactoryOzone();
+    gfx::ClientNativePixmapFactory::SetInstance(
+        client_native_pixmap_factory_.get());
+  }
 
   DCHECK(gfx::ClientNativePixmapFactory::GetInstance());
 
@@ -323,7 +380,10 @@
   if (window_server_->display_creation_config() ==
       ws::DisplayCreationConfig::MANUAL) {
 #if defined(USE_OZONE) && defined(OS_CHROMEOS)
-    screen_manager_ = base::MakeUnique<display::ScreenManagerForwarding>();
+    display::ScreenManagerForwarding::Mode mode =
+        is_in_process() ? display::ScreenManagerForwarding::Mode::IN_WM_PROCESS
+                        : display::ScreenManagerForwarding::Mode::OWN_PROCESS;
+    screen_manager_ = base::MakeUnique<display::ScreenManagerForwarding>(mode);
 #else
     CHECK(false);
 #endif
@@ -335,6 +395,10 @@
     screen_manager_->Init(window_server_->display_manager());
 }
 
+ws::ThreadedImageCursorsFactory* Service::GetThreadedImageCursorsFactory() {
+  return threaded_image_cursors_factory_.get();
+}
+
 void Service::BindAccessibilityManagerRequest(
     const service_manager::BindSourceInfo& source_info,
     mojom::AccessibilityManagerRequest request) {
diff --git a/services/ui/service.h b/services/ui/service.h
index 4d035f9..a2e0888 100644
--- a/services/ui/service.h
+++ b/services/ui/service.h
@@ -13,6 +13,8 @@
 #include <vector>
 
 #include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "base/memory/weak_ptr.h"
 #include "components/discardable_memory/public/interfaces/discardable_shared_memory_manager.mojom.h"
 #include "services/service_manager/public/cpp/binder_registry.h"
 #include "services/service_manager/public/cpp/service.h"
@@ -53,17 +55,37 @@
 
 namespace ui {
 
+class ImageCursorsSet;
 class InputDeviceController;
 class PlatformEventSource;
 
 namespace ws {
+class ThreadedImageCursorsFactory;
 class WindowServer;
 }
 
 class Service : public service_manager::Service,
                 public ws::WindowServerDelegate {
  public:
-  Service();
+  // Contains the configuration necessary to run the UI Service inside the
+  // Window Manager's process.
+  struct InProcessConfig {
+    InProcessConfig();
+    ~InProcessConfig();
+
+    // Can be used to load resources.
+    scoped_refptr<base::SingleThreadTaskRunner> resource_runner = nullptr;
+
+    // Can only be de-referenced on |resource_runner_|.
+    base::WeakPtr<ImageCursorsSet> image_cursors_set_weak_ptr = nullptr;
+
+   private:
+    DISALLOW_COPY_AND_ASSIGN(InProcessConfig);
+  };
+
+  // |config| should be null when UI Service runs in it's own separate process,
+  // as opposed to inside the Window Manager's process.
+  explicit Service(const InProcessConfig* config = nullptr);
   ~Service() override;
 
  private:
@@ -74,6 +96,8 @@
 
   using UserIdToUserState = std::map<ws::UserId, std::unique_ptr<UserState>>;
 
+  bool is_in_process() const { return is_in_process_; }
+
   // Attempts to initialize the resource bundle. Returns true if successful,
   // otherwise false if resources cannot be loaded.
   bool InitializeResources(service_manager::Connector* connector);
@@ -99,6 +123,7 @@
   bool IsTestConfig() const override;
   void OnWillCreateTreeForWindowManager(
       bool automatically_create_display_roots) override;
+  ws::ThreadedImageCursorsFactory* GetThreadedImageCursorsFactory() override;
 
   void BindAccessibilityManagerRequest(
       const service_manager::BindSourceInfo& source_info,
@@ -150,7 +175,7 @@
       mojom::WindowServerTestRequest request);
 
   std::unique_ptr<ws::WindowServer> window_server_;
-  std::unique_ptr<ui::PlatformEventSource> event_source_;
+  std::unique_ptr<PlatformEventSource> event_source_;
   using PendingRequests = std::vector<std::unique_ptr<PendingRequest>>;
   PendingRequests pending_requests_;
 
@@ -160,6 +185,13 @@
   // and must outlive |registry_|.
   InputDeviceServer input_device_server_;
 
+  // True if the UI Service runs inside WM's process, false if it runs inside
+  // its own process.
+  const bool is_in_process_;
+
+  std::unique_ptr<ws::ThreadedImageCursorsFactory>
+      threaded_image_cursors_factory_;
+
   bool test_config_;
 #if defined(USE_OZONE)
   std::unique_ptr<gfx::ClientNativePixmapFactory> client_native_pixmap_factory_;
diff --git a/services/ui/ws/BUILD.gn b/services/ui/ws/BUILD.gn
index 5052a44..351167c 100644
--- a/services/ui/ws/BUILD.gn
+++ b/services/ui/ws/BUILD.gn
@@ -82,6 +82,9 @@
     "server_window_drawn_tracker_observer.h",
     "server_window_observer.h",
     "server_window_tracker.h",
+    "threaded_image_cursors.cc",
+    "threaded_image_cursors.h",
+    "threaded_image_cursors_factory.h",
     "user_activity_monitor.cc",
     "user_activity_monitor.h",
     "user_display_manager.cc",
diff --git a/services/ui/ws/display.cc b/services/ui/ws/display.cc
index 00bf5ad9..ee44cf3 100644
--- a/services/ui/ws/display.cc
+++ b/services/ui/ws/display.cc
@@ -71,7 +71,8 @@
 
   CreateRootWindow(metrics.bounds_in_pixels.size());
 
-  platform_display_ = PlatformDisplay::Create(root_.get(), metrics);
+  platform_display_ = PlatformDisplay::Create(
+      root_.get(), metrics, window_server_->GetThreadedImageCursorsFactory());
   platform_display_->Init(this);
 }
 
diff --git a/services/ui/ws/platform_display.cc b/services/ui/ws/platform_display.cc
index 587e450..92ab3dd9 100644
--- a/services/ui/ws/platform_display.cc
+++ b/services/ui/ws/platform_display.cc
@@ -8,7 +8,8 @@
 #include "services/ui/ws/platform_display_default.h"
 #include "services/ui/ws/platform_display_factory.h"
 #include "services/ui/ws/server_window.h"
-#include "ui/base/cursor/image_cursors.h"
+#include "services/ui/ws/threaded_image_cursors.h"
+#include "services/ui/ws/threaded_image_cursors_factory.h"
 
 namespace ui {
 namespace ws {
@@ -19,7 +20,8 @@
 // static
 std::unique_ptr<PlatformDisplay> PlatformDisplay::Create(
     ServerWindow* root,
-    const display::ViewportMetrics& metrics) {
+    const display::ViewportMetrics& metrics,
+    ThreadedImageCursorsFactory* threaded_image_cursors_factory) {
   if (factory_)
     return factory_->CreatePlatformDisplay(root, metrics);
 
@@ -28,7 +30,7 @@
                                                   nullptr /* image_cursors */);
 #else
   return base::MakeUnique<PlatformDisplayDefault>(
-      root, metrics, base::MakeUnique<ImageCursors>());
+      root, metrics, threaded_image_cursors_factory->CreateCursors());
 #endif
 }
 
diff --git a/services/ui/ws/platform_display.h b/services/ui/ws/platform_display.h
index fb567d73..1a7659b 100644
--- a/services/ui/ws/platform_display.h
+++ b/services/ui/ws/platform_display.h
@@ -27,6 +27,7 @@
 class PlatformDisplayDelegate;
 class PlatformDisplayFactory;
 class ServerWindow;
+class ThreadedImageCursorsFactory;
 
 // PlatformDisplay is used to connect the root ServerWindow to a display.
 class PlatformDisplay : public ui::EventSource {
@@ -35,7 +36,8 @@
 
   static std::unique_ptr<PlatformDisplay> Create(
       ServerWindow* root_window,
-      const display::ViewportMetrics& metrics);
+      const display::ViewportMetrics& metrics,
+      ThreadedImageCursorsFactory* threaded_image_cursors_factory);
 
   virtual void Init(PlatformDisplayDelegate* delegate) = 0;
 
diff --git a/services/ui/ws/platform_display_default.cc b/services/ui/ws/platform_display_default.cc
index 0b4bf02..9676c90 100644
--- a/services/ui/ws/platform_display_default.cc
+++ b/services/ui/ws/platform_display_default.cc
@@ -11,7 +11,7 @@
 #include "services/ui/display/screen_manager.h"
 #include "services/ui/public/interfaces/cursor/cursor_struct_traits.h"
 #include "services/ui/ws/server_window.h"
-#include "ui/base/cursor/image_cursors.h"
+#include "services/ui/ws/threaded_image_cursors.h"
 #include "ui/display/display.h"
 #include "ui/events/event.h"
 #include "ui/events/event_utils.h"
@@ -35,7 +35,7 @@
 PlatformDisplayDefault::PlatformDisplayDefault(
     ServerWindow* root_window,
     const display::ViewportMetrics& metrics,
-    std::unique_ptr<ImageCursors> image_cursors)
+    std::unique_ptr<ThreadedImageCursors> image_cursors)
     : root_window_(root_window),
       image_cursors_(std::move(image_cursors)),
       metrics_(metrics),
@@ -46,9 +46,11 @@
   delegate_ = nullptr;
 
   frame_generator_.reset();
+  image_cursors_.reset();
   // Destroy the PlatformWindow early on as it may call us back during
   // destruction and we want to be in a known state. But destroy the surface
-  // first because it can still be using the platform window.
+  // and ThreadedImageCursors first because they can still be using the platform
+  // window.
   platform_window_.reset();
 }
 
@@ -104,12 +106,15 @@
   if (!image_cursors_)
     return;
 
-  ui::Cursor native_cursor(cursor_data.cursor_type());
+  ui::CursorType cursor_type = cursor_data.cursor_type();
 
 #if defined(USE_OZONE)
-  if (cursor_data.cursor_type() != ui::CursorType::kCustom) {
-    image_cursors_->SetPlatformCursor(&native_cursor);
+  if (cursor_type != ui::CursorType::kCustom) {
+    // |platform_window_| is destroyed after |image_cursors_|, so it is
+    // guaranteed to outlive |image_cursors_|.
+    image_cursors_->SetCursor(cursor_type, platform_window_.get());
   } else {
+    ui::Cursor native_cursor(cursor_type);
     // In Ozone builds, we have an interface available which turns bitmap data
     // into platform cursors.
     ui::CursorFactoryOzone* cursor_factory =
@@ -118,6 +123,7 @@
         cursor_data.cursor_frames(), cursor_data.hotspot_in_pixels(),
         cursor_data.frame_delay().InMilliseconds(),
         cursor_data.scale_factor()));
+    platform_window_->SetCursor(native_cursor.platform());
   }
 #else
   // Outside of ozone builds, there isn't a single interface for creating
@@ -129,14 +135,12 @@
   // cursor management on its own mus windows so we can remove Webcursor from
   // //content/ and do this in way that's safe cross-platform, instead of as an
   // ozone-specific hack.
-  if (cursor_data.cursor_type() == ui::CursorType::kCustom) {
+  if (cursor_type == ui::CursorType::kCustom) {
     NOTIMPLEMENTED() << "No custom cursor support on non-ozone yet.";
-    native_cursor = ui::Cursor(ui::CursorType::kPointer);
+    cursor_type = ui::CursorType::kPointer;
   }
-  image_cursors_->SetPlatformCursor(&native_cursor);
+  image_cursors_->SetCursor(cursor_type, platform_window_.get());
 #endif
-
-  platform_window_->SetCursor(native_cursor.platform());
 }
 
 void PlatformDisplayDefault::MoveCursorTo(
diff --git a/services/ui/ws/platform_display_default.h b/services/ui/ws/platform_display_default.h
index fe00e6b3..b8e8a1f8 100644
--- a/services/ui/ws/platform_display_default.h
+++ b/services/ui/ws/platform_display_default.h
@@ -18,11 +18,12 @@
 namespace ui {
 
 class EventSink;
-class ImageCursors;
 class PlatformWindow;
 
 namespace ws {
 
+class ThreadedImageCursors;
+
 // PlatformDisplay implementation that connects to a PlatformWindow and
 // FrameGenerator for Chrome OS.
 class PlatformDisplayDefault : public PlatformDisplay,
@@ -31,7 +32,7 @@
   // |image_cursors| may be null, for example on Android or in tests.
   PlatformDisplayDefault(ServerWindow* root_window,
                          const display::ViewportMetrics& metrics,
-                         std::unique_ptr<ImageCursors> image_cursors);
+                         std::unique_ptr<ThreadedImageCursors> image_cursors);
   ~PlatformDisplayDefault() override;
 
   // EventSource::
@@ -68,7 +69,7 @@
 
   ServerWindow* root_window_;
 
-  std::unique_ptr<ui::ImageCursors> image_cursors_;
+  std::unique_ptr<ThreadedImageCursors> image_cursors_;
 
   PlatformDisplayDelegate* delegate_ = nullptr;
   std::unique_ptr<FrameGenerator> frame_generator_;
diff --git a/services/ui/ws/platform_display_default_unittest.cc b/services/ui/ws/platform_display_default_unittest.cc
index bc3b399..57c0fb7 100644
--- a/services/ui/ws/platform_display_default_unittest.cc
+++ b/services/ui/ws/platform_display_default_unittest.cc
@@ -5,8 +5,9 @@
 #include "services/ui/ws/platform_display_default.h"
 
 #include "base/time/time.h"
+#include "services/ui/common/image_cursors_set.h"
+#include "services/ui/ws/threaded_image_cursors.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "ui/base/cursor/image_cursors.h"
 #include "ui/display/types/native_display_delegate.h"
 #include "ui/events/event.h"
 #include "ui/events/event_sink.h"
@@ -104,6 +105,8 @@
 // locally and on the trybots on 06/13/2017, while passing when run on the CQ
 // and the builders. crbug.com/732987
 TEST(PlatformDisplayDefaultTest, DISABLED_EventDispatch) {
+  // ThreadTaskRunnerHandle needed required by ThreadedImageCursors.
+  base::MessageLoop loop;
   // Setup ozone so the display can be initialized.
   TestOzonePlatform platform;
 
@@ -112,8 +115,14 @@
   metrics.bounds_in_pixels = gfx::Rect(1024, 768);
   metrics.device_scale_factor = 1.f;
   metrics.ui_scale_factor = 1.f;
+  scoped_refptr<base::SingleThreadTaskRunner> task_runner =
+      base::ThreadTaskRunnerHandle::Get();
+  ImageCursorsSet image_cursors_set;
+  std::unique_ptr<ThreadedImageCursors> threaded_image_cursors =
+      base::MakeUnique<ThreadedImageCursors>(task_runner,
+                                             image_cursors_set.GetWeakPtr());
   PlatformDisplayDefault display(nullptr, metrics,
-                                 std::unique_ptr<ImageCursors>());
+                                 std::move(threaded_image_cursors));
 
   // Initialize the display with a test EventSink so we can sense events.
   TestEventSink event_sink;
diff --git a/services/ui/ws/test_utils.cc b/services/ui/ws/test_utils.cc
index 6a7f622..4dcd24e2b 100644
--- a/services/ui/ws/test_utils.cc
+++ b/services/ui/ws/test_utils.cc
@@ -11,12 +11,15 @@
 #include "cc/output/copy_output_request.h"
 #include "gpu/ipc/client/gpu_channel_host.h"
 #include "services/service_manager/public/interfaces/connector.mojom.h"
+#include "services/ui/common/image_cursors_set.h"
 #include "services/ui/public/interfaces/cursor/cursor.mojom.h"
 #include "services/ui/ws/display_binding.h"
 #include "services/ui/ws/display_creation_config.h"
 #include "services/ui/ws/display_manager.h"
 #include "services/ui/ws/frame_sink_manager_client_binding.h"
 #include "services/ui/ws/gpu_host.h"
+#include "services/ui/ws/threaded_image_cursors.h"
+#include "services/ui/ws/threaded_image_cursors_factory.h"
 #include "services/ui/ws/window_manager_access_policy.h"
 #include "services/ui/ws/window_manager_window_tree_factory.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -89,6 +92,28 @@
   return metrics;
 }
 
+class TestThreadedImageCursorsFactory : public ThreadedImageCursorsFactory {
+ public:
+  TestThreadedImageCursorsFactory() {}
+  ~TestThreadedImageCursorsFactory() override {}
+
+  // ThreadedImageCursorsFactory:
+  std::unique_ptr<ThreadedImageCursors> CreateCursors() override {
+    if (!resource_runner_) {
+      resource_runner_ = base::ThreadTaskRunnerHandle::Get();
+      image_cursors_set_ = base::MakeUnique<ui::ImageCursorsSet>();
+    }
+    return base::MakeUnique<ws::ThreadedImageCursors>(
+        resource_runner_, image_cursors_set_->GetWeakPtr());
+  }
+
+ private:
+  scoped_refptr<base::SingleThreadTaskRunner> resource_runner_;
+  std::unique_ptr<ui::ImageCursorsSet> image_cursors_set_;
+
+  DISALLOW_COPY_AND_ASSIGN(TestThreadedImageCursorsFactory);
+};
+
 }  // namespace
 
 // TestScreenManager  -------------------------------------------------
@@ -509,7 +534,9 @@
 
 // TestWindowServerDelegate ----------------------------------------------
 
-TestWindowServerDelegate::TestWindowServerDelegate() {}
+TestWindowServerDelegate::TestWindowServerDelegate()
+    : threaded_image_cursors_factory_(
+          base::MakeUnique<TestThreadedImageCursorsFactory>()) {}
 TestWindowServerDelegate::~TestWindowServerDelegate() {}
 
 void TestWindowServerDelegate::StartDisplayInit() {}
@@ -546,6 +573,11 @@
                                          : DisplayCreationConfig::MANUAL);
 }
 
+ThreadedImageCursorsFactory*
+TestWindowServerDelegate::GetThreadedImageCursorsFactory() {
+  return threaded_image_cursors_factory_.get();
+}
+
 // WindowServerTestHelper  ---------------------------------------------------
 
 WindowServerTestHelper::WindowServerTestHelper()
diff --git a/services/ui/ws/test_utils.h b/services/ui/ws/test_utils.h
index fee76599..50b864b 100644
--- a/services/ui/ws/test_utils.h
+++ b/services/ui/ws/test_utils.h
@@ -607,6 +607,7 @@
   bool IsTestConfig() const override;
   void OnWillCreateTreeForWindowManager(
       bool automatically_create_display_roots) override;
+  ThreadedImageCursorsFactory* GetThreadedImageCursorsFactory() override;
 
  private:
   WindowServer* window_server_ = nullptr;
@@ -614,6 +615,7 @@
   // All TestWindowTreeBinding objects created via CreateWindowTreeBinding.
   // These are owned by the corresponding WindowTree.
   std::vector<TestWindowTreeBinding*> bindings_;
+  std::unique_ptr<ThreadedImageCursorsFactory> threaded_image_cursors_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(TestWindowServerDelegate);
 };
diff --git a/services/ui/ws/threaded_image_cursors.cc b/services/ui/ws/threaded_image_cursors.cc
new file mode 100644
index 0000000..eb7f2daf
--- /dev/null
+++ b/services/ui/ws/threaded_image_cursors.cc
@@ -0,0 +1,134 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "services/ui/ws/threaded_image_cursors.h"
+
+#include "base/bind.h"
+#include "base/single_thread_task_runner.h"
+#include "base/threading/thread_task_runner_handle.h"
+#include "services/ui/common/image_cursors_set.h"
+#include "ui/base/cursor/image_cursors.h"
+#include "ui/platform_window/platform_window.h"
+
+namespace ui {
+namespace ws {
+namespace {
+
+void AddImageCursorsOnResourceThread(
+    base::WeakPtr<ui::ImageCursorsSet> image_cursors_set_weak_ptr,
+    std::unique_ptr<ui::ImageCursors> image_cursors) {
+  if (image_cursors_set_weak_ptr)
+    image_cursors_set_weak_ptr->AddImageCursors(std::move(image_cursors));
+}
+
+void RemoveImageCursorsOnResourceThread(
+    base::WeakPtr<ui::ImageCursorsSet> image_cursors_set_weak_ptr,
+    base::WeakPtr<ui::ImageCursors> image_cursors_weak_ptr) {
+  if (image_cursors_set_weak_ptr && image_cursors_weak_ptr) {
+    image_cursors_set_weak_ptr->DeleteImageCursors(
+        image_cursors_weak_ptr.get());
+  }
+}
+
+void SetDisplayOnResourceThread(
+    base::WeakPtr<ui::ImageCursors> image_cursors_weak_ptr,
+    const display::Display& display,
+    float scale_factor) {
+  if (image_cursors_weak_ptr)
+    image_cursors_weak_ptr->SetDisplay(display, scale_factor);
+}
+
+void SetCursorSizeOnResourceThread(
+    base::WeakPtr<ui::ImageCursors> image_cursors_weak_ptr,
+    CursorSize cursor_size) {
+  if (image_cursors_weak_ptr)
+    image_cursors_weak_ptr->SetCursorSize(cursor_size);
+}
+
+// Executed on |resource_task_runner_|. Sets cursor type on
+// |image_cursors_set_weak_ptr_|, and then schedules a task on
+// |ui_service_task_runner_| to set the corresponding PlatformCursor on the
+// provided |platform_window|.
+// |platform_window| pointer needs to be valid while
+// |threaded_image_cursors_weak_ptr| is not invalidated.
+void SetCursorOnResourceThread(
+    base::WeakPtr<ui::ImageCursors> image_cursors_weak_ptr,
+    ui::CursorType cursor_type,
+    ui::PlatformWindow* platform_window,
+    scoped_refptr<base::SingleThreadTaskRunner> ui_service_task_runner_,
+    base::WeakPtr<ThreadedImageCursors> threaded_image_cursors_weak_ptr) {
+  if (image_cursors_weak_ptr) {
+    ui::Cursor native_cursor(cursor_type);
+    image_cursors_weak_ptr->SetPlatformCursor(&native_cursor);
+    // |platform_window| is owned by the UI Service thread, so setting the
+    // cursor on it also needs to happen on that thread.
+    ui_service_task_runner_->PostTask(
+        FROM_HERE, base::Bind(&ThreadedImageCursors::SetCursorOnPlatformWindow,
+                              threaded_image_cursors_weak_ptr,
+                              native_cursor.platform(), platform_window));
+  }
+}
+
+}  // namespace
+
+ThreadedImageCursors::ThreadedImageCursors(
+    scoped_refptr<base::SingleThreadTaskRunner>& resource_task_runner,
+    base::WeakPtr<ui::ImageCursorsSet> image_cursors_set_weak_ptr)
+    : resource_task_runner_(resource_task_runner),
+      image_cursors_set_weak_ptr_(image_cursors_set_weak_ptr),
+      weak_ptr_factory_(this) {
+  DCHECK(resource_task_runner_);
+  ui_service_task_runner_ = base::ThreadTaskRunnerHandle::Get();
+
+  // Create and initialize the ImageCursors object here and then set it on
+  // |image_cursors_set_weak_ptr__|. Note that it is essential to initialize
+  // the ImageCursors object on the UI Service's thread if we are using Ozone,
+  // so that it uses the right (thread-local) CursorFactoryOzone instance.
+  std::unique_ptr<ui::ImageCursors> image_cursors =
+      base::MakeUnique<ui::ImageCursors>();
+  image_cursors->Initialize();
+  image_cursors_weak_ptr_ = image_cursors->GetWeakPtr();
+  resource_task_runner_->PostTask(
+      FROM_HERE,
+      base::Bind(&AddImageCursorsOnResourceThread, image_cursors_set_weak_ptr_,
+                 base::Passed(std::move(image_cursors))));
+}
+
+ThreadedImageCursors::~ThreadedImageCursors() {
+  resource_task_runner_->PostTask(
+      FROM_HERE,
+      base::Bind(&RemoveImageCursorsOnResourceThread,
+                 image_cursors_set_weak_ptr_, image_cursors_weak_ptr_));
+}
+
+void ThreadedImageCursors::SetDisplay(const display::Display& display,
+                                      float scale_factor) {
+  resource_task_runner_->PostTask(
+      FROM_HERE, base::Bind(&SetDisplayOnResourceThread,
+                            image_cursors_weak_ptr_, display, scale_factor));
+}
+
+void ThreadedImageCursors::SetCursorSize(CursorSize cursor_size) {
+  resource_task_runner_->PostTask(
+      FROM_HERE, base::Bind(&SetCursorSizeOnResourceThread,
+                            image_cursors_weak_ptr_, cursor_size));
+}
+
+void ThreadedImageCursors::SetCursor(ui::CursorType cursor_type,
+                                     ui::PlatformWindow* platform_window) {
+  resource_task_runner_->PostTask(
+      FROM_HERE,
+      base::Bind(&SetCursorOnResourceThread, image_cursors_weak_ptr_,
+                 cursor_type, platform_window, ui_service_task_runner_,
+                 weak_ptr_factory_.GetWeakPtr()));
+}
+
+void ThreadedImageCursors::SetCursorOnPlatformWindow(
+    ui::PlatformCursor platform_cursor,
+    ui::PlatformWindow* platform_window) {
+  platform_window->SetCursor(platform_cursor);
+}
+
+}  // namespace ws
+}  // namespace ui
diff --git a/services/ui/ws/threaded_image_cursors.h b/services/ui/ws/threaded_image_cursors.h
new file mode 100644
index 0000000..5d07f179c
--- /dev/null
+++ b/services/ui/ws/threaded_image_cursors.h
@@ -0,0 +1,93 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef SERVICES_UI_WS_THREADED_IMAGE_CURSORS_H_
+#define SERVICES_UI_WS_THREADED_IMAGE_CURSORS_H_
+
+#include "base/memory/weak_ptr.h"
+#include "ui/base/cursor/cursor.h"
+
+namespace base {
+class SingleThreadTaskRunner;
+}
+
+namespace display {
+class Display;
+}
+
+namespace ui {
+class ImageCursors;
+class ImageCursorsSet;
+class PlatformWindow;
+
+namespace ws {
+
+// Wrapper around ui::ImageCursors, which executes its methods asynchronously
+// via the provided task runner. This is needed because ui::ImageCursors needs
+// to load resources when executing some of its methods, which cannot happen on
+// the UI Service's thread when it runs inside the Window Manager process.
+//
+// Note: We could execute the methods synchronously when UI Service runs in its
+// own process (and thus the provided task runner matches the task runner of the
+// UI Service's thread), but we don't do that in the interest of sharing code.
+class ThreadedImageCursors {
+ public:
+  // |resource_runner| is the task runner for the thread which can be used to
+  // load resources; |image_cursors_set_weak_ptr_| points to an object that
+  // lives on |resource_runner|'s thread.
+  // We create an ImageCursors object here and then pass the ownership to
+  // |image_cursors_set_weak_ptr_|. All operations on the ImageCursors object
+  // happen on |resource_runner|, which is why we need the owner to live on
+  // |resource_runner|'s thread.
+  ThreadedImageCursors(
+      scoped_refptr<base::SingleThreadTaskRunner>& resource_task_runner,
+      base::WeakPtr<ui::ImageCursorsSet> image_cursors_set_weak_ptr_);
+  ~ThreadedImageCursors();
+
+  // Executes ui::ImageCursors::SetDisplay asynchronously.
+  // Sets the display the cursors are loaded for. |scale_factor| determines the
+  // size of the image to load. Returns true if the cursor image is reloaded.
+  void SetDisplay(const display::Display& display, float scale_factor);
+
+  // Asynchronously sets the size of the mouse cursor icon.
+  void SetCursorSize(CursorSize cursor_size);
+
+  // Asynchronously sets the cursor type and then sets the corresponding
+  // PlatformCursor on the provided |platform_window|.
+  // |platform_window| pointer needs to be valid while this object is alive.
+  void SetCursor(ui::CursorType cursor_type,
+                 ui::PlatformWindow* platform_window);
+
+  // Helper method. Sets |platform_cursor| on the |platform_window|.
+  void SetCursorOnPlatformWindow(ui::PlatformCursor platform_cursor,
+                                 ui::PlatformWindow* platform_window);
+
+ private:
+  // The object used for performing the actual cursor operations.
+  // Created on UI Service's thread, but is used on the
+  // |resource_task_runner_|'s thread, because it needs to load resources.
+  base::WeakPtr<ui::ImageCursors> image_cursors_weak_ptr_;
+
+  // Task runner for the thread which owns the cursor resources.
+  // |image_cursors_set_weak_ptr__| and |image_cursors_weak_ptr_| should only
+  // be dereferenced on this task runner.
+  scoped_refptr<base::SingleThreadTaskRunner> resource_task_runner_;
+
+  // Task runner of the UI Service thread (where this object is created and
+  // destroyed).
+  scoped_refptr<base::SingleThreadTaskRunner> ui_service_task_runner_;
+
+  // Lives on |resource_runner_|'s thread, used to own the object behid
+  // |image_cursors_weak_ptr_|.
+  base::WeakPtr<ui::ImageCursorsSet> image_cursors_set_weak_ptr_;
+
+  base::WeakPtrFactory<ThreadedImageCursors> weak_ptr_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(ThreadedImageCursors);
+};
+
+}  // namespace ws
+}  // namespace ui
+
+#endif  // SERVICES_UI_WS_THREADED_IMAGE_CURSORS_H_
diff --git a/services/ui/ws/threaded_image_cursors_factory.h b/services/ui/ws/threaded_image_cursors_factory.h
new file mode 100644
index 0000000..1deab54
--- /dev/null
+++ b/services/ui/ws/threaded_image_cursors_factory.h
@@ -0,0 +1,23 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef SERVICES_UI_WS_THREADED_IMAGE_CURSORS_FACTORY_H_
+#define SERVICES_UI_WS_THREADED_IMAGE_CURSORS_FACTORY_H_
+
+#include <memory>
+
+namespace ui {
+namespace ws {
+class ThreadedImageCursors;
+
+class ThreadedImageCursorsFactory {
+ public:
+  virtual ~ThreadedImageCursorsFactory() {}
+  virtual std::unique_ptr<ThreadedImageCursors> CreateCursors() = 0;
+};
+
+}  // namespace ws
+}  // namespace ui
+
+#endif  // SERVICES_UI_WS_THREADED_IMAGE_CURSORS_FACTORY_H_
diff --git a/services/ui/ws/user_display_manager.cc b/services/ui/ws/user_display_manager.cc
index f52663f..e432999 100644
--- a/services/ui/ws/user_display_manager.cc
+++ b/services/ui/ws/user_display_manager.cc
@@ -6,9 +6,10 @@
 
 #include <utility>
 
+#include "services/ui/display/screen_manager.h"
 #include "services/ui/ws/user_display_manager_delegate.h"
 #include "ui/display/display.h"
-#include "ui/display/screen.h"
+#include "ui/display/screen_base.h"
 #include "ui/display/types/display_constants.h"
 
 namespace ui {
@@ -95,7 +96,8 @@
 }
 
 std::vector<mojom::WsDisplayPtr> UserDisplayManager::GetAllDisplays() {
-  const auto& displays = display::Screen::GetScreen()->GetAllDisplays();
+  const auto& displays =
+      display::ScreenManager::GetInstance()->GetScreen()->GetAllDisplays();
 
   std::vector<mojom::WsDisplayPtr> ws_display;
   ws_display.reserve(displays.size());
@@ -107,8 +109,10 @@
 }
 
 bool UserDisplayManager::ShouldCallOnDisplaysChanged() const {
-  return got_valid_frame_decorations_ &&
-         !display::Screen::GetScreen()->GetAllDisplays().empty();
+  return got_valid_frame_decorations_ && !display::ScreenManager::GetInstance()
+                                              ->GetScreen()
+                                              ->GetAllDisplays()
+                                              .empty();
 }
 
 void UserDisplayManager::CallOnDisplaysChangedIfNecessary() {
@@ -120,9 +124,12 @@
 
 void UserDisplayManager::CallOnDisplaysChanged(
     mojom::DisplayManagerObserver* observer) {
-  observer->OnDisplaysChanged(
-      GetAllDisplays(), display::Screen::GetScreen()->GetPrimaryDisplay().id(),
-      GetInternalDisplayId());
+  observer->OnDisplaysChanged(GetAllDisplays(),
+                              display::ScreenManager::GetInstance()
+                                  ->GetScreen()
+                                  ->GetPrimaryDisplay()
+                                  .id(),
+                              GetInternalDisplayId());
 }
 
 }  // namespace ws
diff --git a/services/ui/ws/window_server.cc b/services/ui/ws/window_server.cc
index 5e802ac6..802ba6b 100644
--- a/services/ui/ws/window_server.cc
+++ b/services/ui/ws/window_server.cc
@@ -111,6 +111,10 @@
   gpu_host_ = std::move(gpu_host);
 }
 
+ThreadedImageCursorsFactory* WindowServer::GetThreadedImageCursorsFactory() {
+  return delegate()->GetThreadedImageCursorsFactory();
+}
+
 ServerWindow* WindowServer::CreateServerWindow(
     const WindowId& id,
     const std::map<std::string, std::vector<uint8_t>>& properties) {
diff --git a/services/ui/ws/window_server.h b/services/ui/ws/window_server.h
index bdac6fd..9a6d377 100644
--- a/services/ui/ws/window_server.h
+++ b/services/ui/ws/window_server.h
@@ -36,6 +36,7 @@
 class DisplayManager;
 class GpuHost;
 class ServerWindow;
+class ThreadedImageCursorsFactory;
 class UserActivityMonitor;
 class WindowManagerState;
 class WindowServerDelegate;
@@ -81,6 +82,8 @@
 
   void SetGpuHost(std::unique_ptr<GpuHost> gpu_host);
 
+  ThreadedImageCursorsFactory* GetThreadedImageCursorsFactory();
+
   // Creates a new ServerWindow. The return value is owned by the caller, but
   // must be destroyed before WindowServer.
   ServerWindow* CreateServerWindow(
diff --git a/services/ui/ws/window_server_delegate.h b/services/ui/ws/window_server_delegate.h
index 6588bec..1539856 100644
--- a/services/ui/ws/window_server_delegate.h
+++ b/services/ui/ws/window_server_delegate.h
@@ -23,6 +23,7 @@
 namespace ws {
 
 class Display;
+class ThreadedImageCursorsFactory;
 class WindowServer;
 class WindowTree;
 class WindowTreeBinding;
@@ -59,6 +60,8 @@
   virtual void OnWillCreateTreeForWindowManager(
       bool automatically_create_display_roots) = 0;
 
+  virtual ThreadedImageCursorsFactory* GetThreadedImageCursorsFactory() = 0;
+
  protected:
   virtual ~WindowServerDelegate() {}
 };
diff --git a/skia/config/SkUserConfig.h b/skia/config/SkUserConfig.h
index 20e68334..54df758 100644
--- a/skia/config/SkUserConfig.h
+++ b/skia/config/SkUserConfig.h
@@ -208,10 +208,6 @@
 #   define SK_USE_LEGACY_DISTANCE_FIELDS
 #endif
 
-#ifndef SK_SUPPORT_LEGACY_INDEX_8_COLORTYPE
-#define SK_SUPPORT_LEGACY_INDEX_8_COLORTYPE
-#endif
-
 #ifndef SK_DISABLE_DEFERRED_PROXIES
 #define SK_DISABLE_DEFERRED_PROXIES
 #endif
diff --git a/skia/public/interfaces/bitmap_skbitmap_struct_traits.cc b/skia/public/interfaces/bitmap_skbitmap_struct_traits.cc
index fb2e124..f4220f8 100644
--- a/skia/public/interfaces/bitmap_skbitmap_struct_traits.cc
+++ b/skia/public/interfaces/bitmap_skbitmap_struct_traits.cc
@@ -75,7 +75,6 @@
     case kGray_8_SkColorType:
       return skia::mojom::ColorType::GRAY_8;
     case kRGBA_F16_SkColorType:
-    case kIndex_8_SkColorType:
       // these are unsupported
       break;
   }
diff --git a/styleguide/web/web.md b/styleguide/web/web.md
index 60150ef..05ea2f7 100644
--- a/styleguide/web/web.md
+++ b/styleguide/web/web.md
@@ -21,8 +21,8 @@
 
 This guide follows and builds on:
 
-* [Google HTML/CSS Style Guide](https://google.github.io/styleguide/htmlcssguide.xml)
-* [Google JavaScript Style Guide](https://google.github.io/styleguide/javascriptguide.xml)
+* [Google HTML/CSS Style Guide](https://google.github.io/styleguide/htmlcssguide.html)
+* [Google JavaScript Style Guide](https://google.github.io/styleguide/jsguide.html)
 * [Google Polymer Style Guide](http://go/polymer-style)
 
 <div class="note">
@@ -85,7 +85,7 @@
 ## HTML
 
 See the [Google HTML/CSS Style
-guide](https://google.github.io/styleguide/htmlcssguide.xml).
+guide](https://google.github.io/styleguide/htmlcssguide.html).
 
 ### Head
 
@@ -178,7 +178,7 @@
 ## CSS
 
 See the [Google HTML/CSS style
-guide](https://google.github.io/styleguide/htmlcssguide.xml) (and again, browser
+guide](https://google.github.io/styleguide/htmlcssguide.html) (and again, browser
 compatibility issues are less relevant for Chrome-only code).
 
 ```css
@@ -306,7 +306,7 @@
 ### Style
 
 See the [Google JavaScript Style
-Guide](https://google.github.io/styleguide/javascriptguide.xml).
+Guide](https://google.github.io/styleguide/jsguide.html).
 
 * Use `$('element-id')` instead of `document.getElementById`
 
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json
index 7406636..fa4c3fa 100644
--- a/testing/buildbot/chromium.android.json
+++ b/testing/buildbot/chromium.android.json
@@ -69,11 +69,12 @@
           ],
           "dimension_sets": [
             {
-              "android_devices": "4",
+              "android_devices": "1",
               "device_os": "MMB29Q",
               "device_type": "bullhead"
             }
           ],
+          "hard_timeout": 960,
           "output_links": [
             {
               "link": [
@@ -108,12 +109,12 @@
           ],
           "dimension_sets": [
             {
-              "android_devices": "4",
+              "android_devices": "1",
               "device_os": "MMB29Q",
               "device_type": "bullhead"
             }
           ],
-          "hard_timeout": 120,
+          "hard_timeout": 960,
           "output_links": [
             {
               "link": [
@@ -217,11 +218,12 @@
           ],
           "dimension_sets": [
             {
-              "android_devices": "4",
+              "android_devices": "1",
               "device_os": "MMB29Q",
               "device_type": "bullhead"
             }
           ],
+          "hard_timeout": 960,
           "output_links": [
             {
               "link": [
@@ -260,11 +262,12 @@
           ],
           "dimension_sets": [
             {
-              "android_devices": "4",
+              "android_devices": "1",
               "device_os": "MMB29Q",
               "device_type": "bullhead"
             }
           ],
+          "hard_timeout": 960,
           "output_links": [
             {
               "link": [
@@ -302,7 +305,7 @@
           ],
           "dimension_sets": [
             {
-              "android_devices": "4",
+              "android_devices": "1",
               "device_os": "MMB29Q",
               "device_type": "bullhead"
             }
@@ -342,11 +345,12 @@
           ],
           "dimension_sets": [
             {
-              "android_devices": "4",
+              "android_devices": "1",
               "device_os": "MMB29Q",
               "device_type": "bullhead"
             }
           ],
+          "hard_timeout": 960,
           "output_links": [
             {
               "link": [
@@ -542,11 +546,12 @@
           ],
           "dimension_sets": [
             {
-              "android_devices": "4",
+              "android_devices": "1",
               "device_os": "MMB29Q",
               "device_type": "bullhead"
             }
           ],
+          "hard_timeout": 960,
           "output_links": [
             {
               "link": [
@@ -620,11 +625,12 @@
           ],
           "dimension_sets": [
             {
-              "android_devices": "4",
+              "android_devices": "1",
               "device_os": "MMB29Q",
               "device_type": "bullhead"
             }
           ],
+          "hard_timeout": 960,
           "output_links": [
             {
               "link": [
@@ -777,11 +783,12 @@
           ],
           "dimension_sets": [
             {
-              "android_devices": "4",
+              "android_devices": "1",
               "device_os": "MMB29Q",
               "device_type": "bullhead"
             }
           ],
+          "hard_timeout": 960,
           "output_links": [
             {
               "link": [
@@ -933,11 +940,12 @@
           ],
           "dimension_sets": [
             {
-              "android_devices": "4",
+              "android_devices": "1",
               "device_os": "MMB29Q",
               "device_type": "bullhead"
             }
           ],
+          "hard_timeout": 960,
           "output_links": [
             {
               "link": [
@@ -1509,11 +1517,12 @@
           ],
           "dimension_sets": [
             {
-              "android_devices": "4",
+              "android_devices": "1",
               "device_os": "MMB29Q",
               "device_type": "bullhead"
             }
           ],
+          "hard_timeout": 960,
           "output_links": [
             {
               "link": [
@@ -5648,7 +5657,7 @@
           ],
           "dimension_sets": [
             {
-              "android_devices": "4",
+              "android_devices": "1",
               "device_os": "MMB29Q",
               "device_type": "bullhead"
             }
@@ -5688,7 +5697,7 @@
           ],
           "dimension_sets": [
             {
-              "android_devices": "4",
+              "android_devices": "1",
               "device_os": "MMB29Q",
               "device_type": "bullhead"
             }
@@ -5799,7 +5808,7 @@
           ],
           "dimension_sets": [
             {
-              "android_devices": "4",
+              "android_devices": "1",
               "device_os": "MMB29Q",
               "device_type": "bullhead"
             }
@@ -5886,7 +5895,7 @@
           ],
           "dimension_sets": [
             {
-              "android_devices": "4",
+              "android_devices": "1",
               "device_os": "MMB29Q",
               "device_type": "bullhead"
             }
@@ -5974,12 +5983,12 @@
           ],
           "dimension_sets": [
             {
-              "android_devices": "4",
+              "android_devices": "1",
               "device_os": "MMB29Q",
               "device_type": "bullhead"
             }
           ],
-          "hard_timeout": 600,
+          "hard_timeout": 960,
           "output_links": [
             {
               "link": [
@@ -6019,12 +6028,12 @@
           ],
           "dimension_sets": [
             {
-              "android_devices": "4",
+              "android_devices": "1",
               "device_os": "MMB29Q",
               "device_type": "bullhead"
             }
           ],
-          "hard_timeout": 600,
+          "hard_timeout": 960,
           "output_links": [
             {
               "link": [
@@ -6059,7 +6068,7 @@
           ],
           "dimension_sets": [
             {
-              "android_devices": "4",
+              "android_devices": "1",
               "device_os": "MMB29Q",
               "device_type": "bullhead"
             }
@@ -6103,7 +6112,7 @@
           ],
           "dimension_sets": [
             {
-              "android_devices": "4",
+              "android_devices": "1",
               "device_os": "MMB29Q",
               "device_type": "bullhead"
             }
@@ -6483,7 +6492,7 @@
           ],
           "dimension_sets": [
             {
-              "android_devices": "4",
+              "android_devices": "1",
               "device_os": "MMB29Q",
               "device_type": "bullhead"
             }
@@ -6563,7 +6572,7 @@
           ],
           "dimension_sets": [
             {
-              "android_devices": "4",
+              "android_devices": "1",
               "device_os": "MMB29Q",
               "device_type": "bullhead"
             }
@@ -6723,7 +6732,7 @@
           ],
           "dimension_sets": [
             {
-              "android_devices": "4",
+              "android_devices": "1",
               "device_os": "MMB29Q",
               "device_type": "bullhead"
             }
@@ -6843,7 +6852,7 @@
           ],
           "dimension_sets": [
             {
-              "android_devices": "4",
+              "android_devices": "1",
               "device_os": "MMB29Q",
               "device_type": "bullhead"
             }
@@ -7238,7 +7247,7 @@
           ],
           "dimension_sets": [
             {
-              "android_devices": "4",
+              "android_devices": "1",
               "device_os": "MMB29Q",
               "device_type": "bullhead"
             }
diff --git a/testing/buildbot/chromium.full.json b/testing/buildbot/chromium.full.json
deleted file mode 100644
index 95777a6..0000000
--- a/testing/buildbot/chromium.full.json
+++ /dev/null
@@ -1,637 +0,0 @@
-{
-  "Linux ChromeOS MSan Tests": {
-    "gtest_tests": [
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "accessibility_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "aura_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "base_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 10
-        },
-        "test": "browser_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "cacheinvalidation_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "capture_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "cast_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "cc_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "chromedriver_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "components_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "compositor_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "content_browsertests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "content_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "crypto_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "dbus_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "device_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "display_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "events_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "extensions_browsertests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "extensions_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "gcm_unit_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "google_apis_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "gpu_ipc_service_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "gpu_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 2
-        },
-        "test": "interactive_ui_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "ipc_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "jingle_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "latency_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "media_blink_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "media_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "midi_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "mojo_common_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "mojo_public_bindings_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "mojo_public_system_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "mojo_system_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "nacl_loader_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "native_theme_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "net_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "pdf_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "ppapi_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "printing_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "remoting_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "sandbox_linux_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "skia_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "sql_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "storage_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "ui_base_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "unit_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "url_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "views_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "wm_unittests"
-      }
-    ]
-  },
-  "Linux MSan Tests": {
-    "gtest_tests": [
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "accessibility_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "aura_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "base_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 10
-        },
-        "test": "browser_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "cacheinvalidation_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "capture_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "cast_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "cc_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "chromedriver_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "components_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "compositor_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "content_browsertests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "content_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "crypto_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "dbus_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "device_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "display_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "events_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "extensions_browsertests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "extensions_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "gcm_unit_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "gfx_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "google_apis_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "gpu_ipc_service_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "gpu_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "interactive_ui_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "ipc_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "jingle_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "latency_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "media_blink_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "media_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "midi_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "mojo_common_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "mojo_public_bindings_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "mojo_public_system_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "mojo_system_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "nacl_loader_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "native_theme_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "net_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "pdf_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "ppapi_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "printing_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "remoting_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "sandbox_linux_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "skia_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "sql_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "storage_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "ui_base_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "ui_touch_selection_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "unit_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "url_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "views_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "wm_unittests"
-      }
-    ]
-  }
-}
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index 67ddf8c..a8a1f59 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -1,230 +1,4 @@
 {
-  "Android Asan Builder Tests (dbg)": {
-    "gtest_tests": [
-      {
-        "args": [
-          "--tool=asan"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false
-        },
-        "test": "android_webview_unittests"
-      },
-      {
-        "args": [
-          "--tool=asan"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false
-        },
-        "test": "base_unittests"
-      },
-      {
-        "args": [
-          "--tool=asan"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false
-        },
-        "test": "capture_unittests"
-      },
-      {
-        "args": [
-          "--tool=asan"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false
-        },
-        "test": "cc_unittests"
-      },
-      {
-        "args": [
-          "--tool=asan"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false
-        },
-        "test": "components_unittests"
-      },
-      {
-        "args": [
-          "--tool=asan"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false
-        },
-        "test": "content_browsertests"
-      },
-      {
-        "args": [
-          "--tool=asan"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false
-        },
-        "test": "content_unittests"
-      },
-      {
-        "args": [
-          "--tool=asan"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false
-        },
-        "test": "events_unittests"
-      },
-      {
-        "args": [
-          "--tool=asan"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false
-        },
-        "test": "gl_tests"
-      },
-      {
-        "args": [
-          "--tool=asan"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false
-        },
-        "test": "gl_unittests"
-      },
-      {
-        "args": [
-          "--tool=asan"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false
-        },
-        "test": "gpu_ipc_service_unittests"
-      },
-      {
-        "args": [
-          "--tool=asan"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false
-        },
-        "test": "gpu_unittests"
-      },
-      {
-        "args": [
-          "--tool=asan"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false
-        },
-        "test": "ipc_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "latency_unittests"
-      },
-      {
-        "args": [
-          "--tool=asan"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false
-        },
-        "test": "media_unittests"
-      },
-      {
-        "args": [
-          "--tool=asan"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false
-        },
-        "test": "midi_unittests"
-      },
-      {
-        "args": [
-          "--tool=asan"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false
-        },
-        "test": "net_unittests"
-      },
-      {
-        "args": [
-          "--tool=asan"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false
-        },
-        "test": "skia_unittests"
-      },
-      {
-        "args": [
-          "--tool=asan"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false
-        },
-        "test": "sql_unittests"
-      },
-      {
-        "args": [
-          "--tool=asan"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false
-        },
-        "test": "storage_unittests"
-      },
-      {
-        "args": [
-          "--tool=asan"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false
-        },
-        "test": "ui_android_unittests"
-      },
-      {
-        "args": [
-          "--tool=asan"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false
-        },
-        "test": "ui_base_unittests"
-      },
-      {
-        "args": [
-          "--tool=asan"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false
-        },
-        "test": "ui_touch_selection_unittests"
-      },
-      {
-        "args": [
-          "--tool=asan"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false
-        },
-        "test": "unit_tests"
-      },
-      {
-        "args": [
-          "--tool=asan"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": false
-        },
-        "test": "webkit_unit_tests"
-      }
-    ]
-  },
   "Android Builder Goma Canary (dbg)": {
     "additional_compile_targets": [
       "all"
@@ -328,6 +102,27 @@
         "test": "chrome_public_test_vr_apk"
       },
       {
+        "args": [
+          "--shared-prefs-file=../../chrome/android/shared_preference_files/test/vr_ddview_don_setupcomplete.json",
+          "--replace-system-package=com.google.vr.vrcore,../../third_party/gvr-android-sdk/test-apks/vr_services/vr_services_current.apk",
+          "--annotation=Restriction=DON_Enabled",
+          "--don-enabled"
+        ],
+        "name": "chrome_public_test_vr_apk-marlin-ddview-nougat-donenabled",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "android_devices": "1",
+              "device_os": "NMF26U",
+              "device_type": "marlin"
+            }
+          ],
+          "hard_timeout": 960
+        },
+        "test": "chrome_public_test_vr_apk"
+      },
+      {
         "swarming": {
           "can_use_on_swarming_builders": false
         },
@@ -349,6 +144,16 @@
           "--additional-apk=src/third_party/gvr-android-sdk/test-apks/daydream_home/daydream_home_current.apk"
         ],
         "test": "chrome_public_test_vr_apk"
+      },
+      {
+        "args": [
+          "--shared-prefs-file=src/chrome/android/shared_preference_files/test/vr_ddview_don_setupcomplete.json",
+          "--additional-apk=src/third_party/gvr-android-sdk/test-apks/vr_services/vr_services_current.apk",
+          "--additional-apk=src/third_party/gvr-android-sdk/test-apks/daydream_home/daydream_home_current.apk",
+          "--annotation=Restriction=DON_Enabled",
+          "--don-enabled"
+        ],
+        "test": "chrome_public_test_vr_apk"
       }
     ]
   },
@@ -11807,81 +11612,6 @@
       }
     ]
   },
-  "Linux ARM (dbg)": {
-    "gtest_tests": [
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "nacl_helper_nonsfi_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "nacl_loader_unittests"
-      },
-      {
-        "args": [
-          "--test-launcher-print-test-stdio=always"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "sandbox_linux_unittests"
-      }
-    ]
-  },
-  "Linux ARM64": {
-    "gtest_tests": [
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "nacl_helper_nonsfi_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "nacl_loader_unittests"
-      },
-      {
-        "args": [
-          "--test-launcher-print-test-stdio=always"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "sandbox_linux_unittests"
-      }
-    ]
-  },
-  "Linux ARM64 (dbg)": {
-    "gtest_tests": [
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "nacl_helper_nonsfi_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "nacl_loader_unittests"
-      },
-      {
-        "args": [
-          "--test-launcher-print-test-stdio=always"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "sandbox_linux_unittests"
-      }
-    ]
-  },
   "Linux Clang Analyzer": {
     "additional_compile_targets": [
       "chrome"
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json
index 35f89e28..ffff572 100644
--- a/testing/buildbot/chromium.gpu.fyi.json
+++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -10895,293 +10895,6 @@
       }
     ]
   },
-  "Optional Mac 10.10 Release (Intel)": {
-    "gtest_tests": [
-      {
-        "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0a2e",
-              "os": "Mac-10.12"
-            }
-          ]
-        },
-        "test": "angle_end2end_tests",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0a2e",
-              "os": "Mac-10.12"
-            }
-          ]
-        },
-        "test": "audio_unittests",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0a2e",
-              "os": "Mac-10.12"
-            }
-          ]
-        },
-        "test": "gles2_conform_test",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--gtest_filter=*Detection*",
-          "--use-gpu-in-tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0a2e",
-              "os": "Mac-10.12"
-            }
-          ]
-        },
-        "test": "services_unittests",
-        "use_xvfb": false
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0a2e",
-              "os": "Mac-10.12"
-            }
-          ]
-        },
-        "test": "swiftshader_unittests",
-        "use_xvfb": false
-      }
-    ],
-    "isolated_scripts": [
-      {
-        "args": [
-          "info_collection",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
-          "--expected-vendor-id",
-          "8086",
-          "--expected-device-id",
-          "0a2e"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "info_collection_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0a2e",
-              "os": "Mac-10.12"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "webgl_conformance",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
-          "--webgl-conformance-version=2.0.1",
-          "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl2_conformance_tests_output.json"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "webgl2_conformance_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0a2e",
-              "os": "Mac-10.12"
-            }
-          ],
-          "shards": 15
-        }
-      }
-    ]
-  },
-  "Optional Mac 10.10 Retina Release (AMD)": {
-    "gtest_tests": [
-      {
-        "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6821",
-              "hidpi": "1",
-              "os": "Mac"
-            }
-          ]
-        },
-        "test": "angle_end2end_tests",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6821",
-              "hidpi": "1",
-              "os": "Mac"
-            }
-          ]
-        },
-        "test": "audio_unittests",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6821",
-              "hidpi": "1",
-              "os": "Mac"
-            }
-          ]
-        },
-        "test": "gles2_conform_test",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--gtest_filter=*Detection*",
-          "--use-gpu-in-tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6821",
-              "hidpi": "1",
-              "os": "Mac"
-            }
-          ]
-        },
-        "test": "services_unittests",
-        "use_xvfb": false
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6821",
-              "hidpi": "1",
-              "os": "Mac"
-            }
-          ]
-        },
-        "test": "swiftshader_unittests",
-        "use_xvfb": false
-      }
-    ],
-    "isolated_scripts": [
-      {
-        "args": [
-          "info_collection",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
-          "--expected-vendor-id",
-          "1002",
-          "--expected-device-id",
-          "6821"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "info_collection_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6821",
-              "hidpi": "1",
-              "os": "Mac"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "webgl_conformance",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
-          "--webgl-conformance-version=2.0.1",
-          "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl2_conformance_tests_output.json"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "webgl2_conformance_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6821",
-              "hidpi": "1",
-              "os": "Mac"
-            }
-          ],
-          "shards": 15
-        }
-      }
-    ]
-  },
   "Optional Mac Release (Intel)": {
     "gtest_tests": [
       {
@@ -11322,153 +11035,6 @@
       }
     ]
   },
-  "Optional Mac Retina Release": {
-    "gtest_tests": [
-      {
-        "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "10de:0fe9",
-              "hidpi": "1",
-              "os": "Mac"
-            }
-          ]
-        },
-        "test": "angle_end2end_tests",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "10de:0fe9",
-              "hidpi": "1",
-              "os": "Mac"
-            }
-          ]
-        },
-        "test": "audio_unittests",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "10de:0fe9",
-              "hidpi": "1",
-              "os": "Mac"
-            }
-          ]
-        },
-        "test": "gles2_conform_test",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--gtest_filter=*Detection*",
-          "--use-gpu-in-tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "10de:0fe9",
-              "hidpi": "1",
-              "os": "Mac"
-            }
-          ]
-        },
-        "test": "services_unittests",
-        "use_xvfb": false
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "10de:0fe9",
-              "hidpi": "1",
-              "os": "Mac"
-            }
-          ]
-        },
-        "test": "swiftshader_unittests",
-        "use_xvfb": false
-      }
-    ],
-    "isolated_scripts": [
-      {
-        "args": [
-          "info_collection",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
-          "--expected-vendor-id",
-          "10de",
-          "--expected-device-id",
-          "0fe9"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "info_collection_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "10de:0fe9",
-              "hidpi": "1",
-              "os": "Mac"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "webgl_conformance",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
-          "--webgl-conformance-version=2.0.1",
-          "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl2_conformance_tests_output.json"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "webgl2_conformance_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "10de:0fe9",
-              "hidpi": "1",
-              "os": "Mac"
-            }
-          ],
-          "shards": 15
-        }
-      }
-    ]
-  },
   "Optional Mac Retina Release (AMD)": {
     "gtest_tests": [
       {
@@ -11763,249 +11329,6 @@
       }
     ]
   },
-  "Optional Win7 Release (AMD)": {
-    "gtest_tests": [
-      {
-        "args": [
-          "--test-launcher-batch-limit=400",
-          "--deqp-egl-display-type=angle-d3d11"
-        ],
-        "name": "angle_deqp_gles2_d3d11_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6613",
-              "os": "Windows-2008ServerR2-SP1"
-            }
-          ],
-          "shards": 4
-        },
-        "test": "angle_deqp_gles2_tests",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6613",
-              "os": "Windows-2008ServerR2-SP1"
-            }
-          ]
-        },
-        "test": "angle_end2end_tests",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--test-launcher-retry-limit=0"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6613",
-              "os": "Windows-2008ServerR2-SP1"
-            }
-          ]
-        },
-        "test": "angle_white_box_tests",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6613",
-              "os": "Windows-2008ServerR2-SP1"
-            }
-          ]
-        },
-        "test": "audio_unittests",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests",
-          "--use-angle=d3d9"
-        ],
-        "name": "gles2_conform_d3d9_test",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6613",
-              "os": "Windows-2008ServerR2-SP1"
-            }
-          ]
-        },
-        "test": "gles2_conform_test",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests",
-          "--use-angle=gl",
-          "--disable-gpu-sandbox"
-        ],
-        "name": "gles2_conform_gl_test",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6613",
-              "os": "Windows-2008ServerR2-SP1"
-            }
-          ]
-        },
-        "test": "gles2_conform_test",
-        "use_xvfb": false
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6613",
-              "os": "Windows-2008ServerR2-SP1"
-            }
-          ]
-        },
-        "test": "gles2_conform_test",
-        "use_xvfb": false
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6613",
-              "os": "Windows-2008ServerR2-SP1"
-            }
-          ]
-        },
-        "test": "swiftshader_unittests",
-        "use_xvfb": false
-      }
-    ],
-    "isolated_scripts": [
-      {
-        "args": [
-          "info_collection",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
-          "--expected-vendor-id",
-          "1002",
-          "--expected-device-id",
-          "6613"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "info_collection_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6613",
-              "os": "Windows-2008ServerR2-SP1"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "webgl_conformance",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
-          "--webgl-conformance-version=2.0.1",
-          "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl2_conformance_tests_output.json"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "webgl2_conformance_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6613",
-              "os": "Windows-2008ServerR2-SP1"
-            }
-          ],
-          "shards": 15
-        }
-      },
-      {
-        "args": [
-          "webgl_conformance",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-angle=d3d11 --use-passthrough-cmd-decoder"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "webgl_conformance_d3d11_passthrough_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6613",
-              "os": "Windows-2008ServerR2-SP1"
-            }
-          ]
-        }
-      },
-      {
-        "args": [
-          "webgl_conformance",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-angle=d3d9"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "name": "webgl_conformance_d3d9_tests",
-        "override_compile_targets": [
-          "telemetry_gpu_integration_test"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6613",
-              "os": "Windows-2008ServerR2-SP1"
-            }
-          ]
-        }
-      }
-    ]
-  },
   "Optional Win7 Release (NVIDIA)": {
     "gtest_tests": [
       {
diff --git a/testing/buildbot/chromium.json b/testing/buildbot/chromium.json
index 044d866..951cb6b 100644
--- a/testing/buildbot/chromium.json
+++ b/testing/buildbot/chromium.json
@@ -1,22 +1,4 @@
 {
-  "Linux": {
-    "additional_compile_targets": [
-      "all"
-    ],
-    "scripts": [
-      {
-        "name": "checkperms",
-        "script": "checkperms.py"
-      },
-      {
-        "args": [
-          "linux-release/sizes"
-        ],
-        "name": "sizes",
-        "script": "sizes.py"
-      }
-    ]
-  },
   "Linux x64": {
     "additional_compile_targets": [
       "all"
diff --git a/testing/buildbot/chromium.linux.json b/testing/buildbot/chromium.linux.json
index 9c54e65..fcc94b2 100644
--- a/testing/buildbot/chromium.linux.json
+++ b/testing/buildbot/chromium.linux.json
@@ -1588,7 +1588,7 @@
           ],
           "dimension_sets": [
             {
-              "android_devices": "6",
+              "android_devices": "1",
               "device_os": "KTU84P",
               "device_type": "hammerhead"
             }
@@ -1603,7 +1603,8 @@
               ],
               "name": "shard #${SHARD_INDEX} logcats"
             }
-          ]
+          ],
+          "shards": 8
         },
         "test": "webview_instrumentation_test_apk"
       }
@@ -3228,7 +3229,7 @@
           ],
           "dimension_sets": [
             {
-              "android_devices": "6",
+              "android_devices": "1",
               "device_os": "KTU84P",
               "device_type": "hammerhead"
             }
@@ -3243,7 +3244,8 @@
               ],
               "name": "shard #${SHARD_INDEX} logcats"
             }
-          ]
+          ],
+          "shards": 8
         },
         "test": "webview_instrumentation_test_apk"
       }
diff --git a/testing/buildbot/chromium.mac.json b/testing/buildbot/chromium.mac.json
index 8cbb9f8d..ab9c171 100644
--- a/testing/buildbot/chromium.mac.json
+++ b/testing/buildbot/chromium.mac.json
@@ -1,31 +1,4 @@
 {
-  "Mac GYP": {
-    "additional_compile_targets": [
-      "base_unittests",
-      "browser_tests",
-      "chrome",
-      "content_browsertests",
-      "content_unittests",
-      "interactive_ui_tests",
-      "ipc_tests",
-      "media_unittests",
-      "net_unittests",
-      "pdf_unittests",
-      "printing_unittests",
-      "skia_unittests",
-      "snapshot_unittests",
-      "sql_unittests",
-      "storage_unittests",
-      "ui_base_unittests",
-      "unit_tests",
-      "url_unittests"
-    ]
-  },
-  "Mac GYP (dbg)": {
-    "additional_compile_targets": [
-      "all"
-    ]
-  },
   "Mac10.10 Tests": {
     "gtest_tests": [
       {
diff --git a/testing/buildbot/chromium.memory.fyi.json b/testing/buildbot/chromium.memory.fyi.json
deleted file mode 100644
index 2c53a73..0000000
--- a/testing/buildbot/chromium.memory.fyi.json
+++ /dev/null
@@ -1,1858 +0,0 @@
-{
-  "Chromium Windows Builder (DrMemory x64)": {
-    "additional_compile_targets": [
-      "accessibility_unittests",
-      "angle_unittests",
-      "aura_unittests",
-      "base_unittests",
-      "blink_heap_unittests",
-      "blink_platform_unittests",
-      "cacheinvalidation_unittests",
-      "capture_unittests",
-      "cast_unittests",
-      "cc_unittests",
-      "chrome_app_unittests",
-      "chrome_elf_unittests",
-      "chromedriver_unittests",
-      "components_unittests",
-      "compositor_unittests",
-      "content_unittests",
-      "courgette_unittests",
-      "crypto_unittests",
-      "device_unittests",
-      "display_unittests",
-      "extensions_unittests",
-      "events_unittests",
-      "gcm_unit_tests",
-      "gfx_unittests",
-      "gin_unittests",
-      "google_apis_unittests",
-      "gpu_ipc_service_unittests",
-      "gpu_unittests",
-      "installer_util_unittests",
-      "install_static_unittests",
-      "ipc_tests",
-      "jingle_unittests",
-      "libaddressinput_unittests",
-      "libphonenumber_unittests",
-      "keyboard_unittests",
-      "media_unittests",
-      "midi_unittests",
-      "mojo_system_unittests",
-      "mojo_public_system_unittests",
-      "mojo_public_bindings_unittests",
-      "mojo_common_unittests",
-      "net_unittests",
-      "pdf_unittests",
-      "printing_unittests",
-      "remoting_unittests",
-      "sql_unittests",
-      "storage_unittests",
-      "unit_tests",
-      "url_unittests"
-    ]
-  },
-  "Chromium Windows Builder (DrMemory)": {
-    "additional_compile_targets": [
-      "accessibility_unittests",
-      "angle_unittests",
-      "aura_unittests",
-      "base_unittests",
-      "blink_heap_unittests",
-      "blink_platform_unittests",
-      "capture_unittests",
-      "url_unittests",
-      "pdf_unittests",
-      "printing_unittests",
-      "media_unittests",
-      "midi_unittests",
-      "sql_unittests",
-      "storage_unittests",
-      "crypto_unittests",
-      "remoting_unittests",
-      "ipc_tests",
-      "net_unittests",
-      "components_unittests",
-      "device_unittests",
-      "jingle_unittests",
-      "gcm_unit_tests",
-      "gpu_ipc_service_unittests",
-      "gpu_unittests",
-      "content_unittests",
-      "cacheinvalidation_unittests",
-      "mojo_system_unittests",
-      "mojo_public_system_unittests",
-      "mojo_public_bindings_unittests",
-      "mojo_common_unittests",
-      "cast_unittests",
-      "cc_unittests",
-      "chrome_elf_unittests",
-      "chromedriver_unittests",
-      "compositor_unittests",
-      "courgette_unittests",
-      "display_unittests",
-      "extensions_unittests",
-      "events_unittests",
-      "gin_unittests",
-      "google_apis_unittests",
-      "gfx_unittests",
-      "installer_util_unittests",
-      "install_static_unittests",
-      "keyboard_unittests",
-      "unit_tests",
-      "chrome_app_unittests",
-      "libaddressinput_unittests",
-      "libphonenumber_unittests",
-      "content_browsertests",
-      "browser_tests"
-    ]
-  },
-  "Linux ChromeOS MSan Tests": {
-    "gtest_tests": [
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "accessibility_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "aura_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "base_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 10
-        },
-        "test": "browser_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "cacheinvalidation_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "capture_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "cast_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "cc_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "chromedriver_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "components_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "compositor_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "content_browsertests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "content_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "crypto_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "dbus_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "device_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "display_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "events_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "extensions_browsertests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "extensions_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "gcm_unit_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "google_apis_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "gpu_ipc_service_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "gpu_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 2
-        },
-        "test": "interactive_ui_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "ipc_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "jingle_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "latency_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "media_blink_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "media_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "midi_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "mojo_common_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "mojo_public_bindings_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "mojo_public_system_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "mojo_system_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "nacl_loader_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "native_theme_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "net_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "pdf_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "ppapi_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "printing_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "remoting_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "sandbox_linux_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "skia_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "sql_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "storage_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "ui_base_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "unit_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "url_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "views_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "wm_unittests"
-      }
-    ]
-  },
-  "Linux MSan Tests": {
-    "gtest_tests": [
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "accessibility_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "aura_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "base_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 10
-        },
-        "test": "browser_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "cacheinvalidation_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "capture_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "cast_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "cc_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "chromedriver_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "components_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "compositor_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "content_browsertests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "content_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "crypto_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "dbus_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "device_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "display_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "events_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "extensions_browsertests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "extensions_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "gcm_unit_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "gfx_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "google_apis_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "gpu_ipc_service_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "gpu_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "interactive_ui_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "ipc_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "jingle_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "latency_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "media_blink_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "media_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "midi_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "mojo_common_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "mojo_public_bindings_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "mojo_public_system_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "mojo_system_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "nacl_loader_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "native_theme_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "net_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "pdf_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "ppapi_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "printing_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "remoting_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "sandbox_linux_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "skia_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "sql_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "storage_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "ui_base_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "ui_touch_selection_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "unit_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "url_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "views_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "wm_unittests"
-      }
-    ]
-  },
-  "Windows Browser (DrMemory full) (1)": {
-    "gtest_tests": [
-      {
-        "shard_index": 0,
-        "test": "browser_tests",
-        "total_shards": 48
-      },
-      {
-        "shard_index": 1,
-        "test": "browser_tests",
-        "total_shards": 48
-      },
-      {
-        "shard_index": 2,
-        "test": "browser_tests",
-        "total_shards": 48
-      },
-      {
-        "shard_index": 3,
-        "test": "browser_tests",
-        "total_shards": 48
-      }
-    ]
-  },
-  "Windows Browser (DrMemory full) (10)": {
-    "gtest_tests": [
-      {
-        "shard_index": 36,
-        "test": "browser_tests",
-        "total_shards": 48
-      },
-      {
-        "shard_index": 37,
-        "test": "browser_tests",
-        "total_shards": 48
-      },
-      {
-        "shard_index": 38,
-        "test": "browser_tests",
-        "total_shards": 48
-      },
-      {
-        "shard_index": 39,
-        "test": "browser_tests",
-        "total_shards": 48
-      }
-    ]
-  },
-  "Windows Browser (DrMemory full) (11)": {
-    "gtest_tests": [
-      {
-        "shard_index": 40,
-        "test": "browser_tests",
-        "total_shards": 48
-      },
-      {
-        "shard_index": 41,
-        "test": "browser_tests",
-        "total_shards": 48
-      },
-      {
-        "shard_index": 42,
-        "test": "browser_tests",
-        "total_shards": 48
-      },
-      {
-        "shard_index": 43,
-        "test": "browser_tests",
-        "total_shards": 48
-      }
-    ]
-  },
-  "Windows Browser (DrMemory full) (12)": {
-    "gtest_tests": [
-      {
-        "shard_index": 44,
-        "test": "browser_tests",
-        "total_shards": 48
-      },
-      {
-        "shard_index": 45,
-        "test": "browser_tests",
-        "total_shards": 48
-      },
-      {
-        "shard_index": 46,
-        "test": "browser_tests",
-        "total_shards": 48
-      },
-      {
-        "shard_index": 47,
-        "test": "browser_tests",
-        "total_shards": 48
-      }
-    ]
-  },
-  "Windows Browser (DrMemory full) (2)": {
-    "gtest_tests": [
-      {
-        "shard_index": 4,
-        "test": "browser_tests",
-        "total_shards": 48
-      },
-      {
-        "shard_index": 5,
-        "test": "browser_tests",
-        "total_shards": 48
-      },
-      {
-        "shard_index": 6,
-        "test": "browser_tests",
-        "total_shards": 48
-      },
-      {
-        "shard_index": 7,
-        "test": "browser_tests",
-        "total_shards": 48
-      }
-    ]
-  },
-  "Windows Browser (DrMemory full) (3)": {
-    "gtest_tests": [
-      {
-        "shard_index": 8,
-        "test": "browser_tests",
-        "total_shards": 48
-      },
-      {
-        "shard_index": 9,
-        "test": "browser_tests",
-        "total_shards": 48
-      },
-      {
-        "shard_index": 10,
-        "test": "browser_tests",
-        "total_shards": 48
-      },
-      {
-        "shard_index": 11,
-        "test": "browser_tests",
-        "total_shards": 48
-      }
-    ]
-  },
-  "Windows Browser (DrMemory full) (4)": {
-    "gtest_tests": [
-      {
-        "shard_index": 12,
-        "test": "browser_tests",
-        "total_shards": 48
-      },
-      {
-        "shard_index": 13,
-        "test": "browser_tests",
-        "total_shards": 48
-      },
-      {
-        "shard_index": 14,
-        "test": "browser_tests",
-        "total_shards": 48
-      },
-      {
-        "shard_index": 15,
-        "test": "browser_tests",
-        "total_shards": 48
-      }
-    ]
-  },
-  "Windows Browser (DrMemory full) (5)": {
-    "gtest_tests": [
-      {
-        "shard_index": 16,
-        "test": "browser_tests",
-        "total_shards": 48
-      },
-      {
-        "shard_index": 17,
-        "test": "browser_tests",
-        "total_shards": 48
-      },
-      {
-        "shard_index": 18,
-        "test": "browser_tests",
-        "total_shards": 48
-      },
-      {
-        "shard_index": 19,
-        "test": "browser_tests",
-        "total_shards": 48
-      }
-    ]
-  },
-  "Windows Browser (DrMemory full) (6)": {
-    "gtest_tests": [
-      {
-        "shard_index": 20,
-        "test": "browser_tests",
-        "total_shards": 48
-      },
-      {
-        "shard_index": 21,
-        "test": "browser_tests",
-        "total_shards": 48
-      },
-      {
-        "shard_index": 22,
-        "test": "browser_tests",
-        "total_shards": 48
-      },
-      {
-        "shard_index": 23,
-        "test": "browser_tests",
-        "total_shards": 48
-      }
-    ]
-  },
-  "Windows Browser (DrMemory full) (7)": {
-    "gtest_tests": [
-      {
-        "shard_index": 24,
-        "test": "browser_tests",
-        "total_shards": 48
-      },
-      {
-        "shard_index": 25,
-        "test": "browser_tests",
-        "total_shards": 48
-      },
-      {
-        "shard_index": 26,
-        "test": "browser_tests",
-        "total_shards": 48
-      },
-      {
-        "shard_index": 27,
-        "test": "browser_tests",
-        "total_shards": 48
-      }
-    ]
-  },
-  "Windows Browser (DrMemory full) (8)": {
-    "gtest_tests": [
-      {
-        "shard_index": 28,
-        "test": "browser_tests",
-        "total_shards": 48
-      },
-      {
-        "shard_index": 29,
-        "test": "browser_tests",
-        "total_shards": 48
-      },
-      {
-        "shard_index": 30,
-        "test": "browser_tests",
-        "total_shards": 48
-      },
-      {
-        "shard_index": 31,
-        "test": "browser_tests",
-        "total_shards": 48
-      }
-    ]
-  },
-  "Windows Browser (DrMemory full) (9)": {
-    "gtest_tests": [
-      {
-        "shard_index": 32,
-        "test": "browser_tests",
-        "total_shards": 48
-      },
-      {
-        "shard_index": 33,
-        "test": "browser_tests",
-        "total_shards": 48
-      },
-      {
-        "shard_index": 34,
-        "test": "browser_tests",
-        "total_shards": 48
-      },
-      {
-        "shard_index": 35,
-        "test": "browser_tests",
-        "total_shards": 48
-      }
-    ]
-  },
-  "Windows Content Browser (DrMemory full) (1)": {
-    "gtest_tests": [
-      {
-        "shard_index": 0,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 1,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 2,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 3,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 4,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 5,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 6,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 7,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 8,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 9,
-        "test": "content_browsertests",
-        "total_shards": 60
-      }
-    ]
-  },
-  "Windows Content Browser (DrMemory full) (2)": {
-    "gtest_tests": [
-      {
-        "shard_index": 10,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 11,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 12,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 13,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 14,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 15,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 16,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 17,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 18,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 19,
-        "test": "content_browsertests",
-        "total_shards": 60
-      }
-    ]
-  },
-  "Windows Content Browser (DrMemory full) (3)": {
-    "gtest_tests": [
-      {
-        "shard_index": 20,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 21,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 22,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 23,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 24,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 25,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 26,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 27,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 28,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 29,
-        "test": "content_browsertests",
-        "total_shards": 60
-      }
-    ]
-  },
-  "Windows Content Browser (DrMemory full) (4)": {
-    "gtest_tests": [
-      {
-        "shard_index": 30,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 31,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 32,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 33,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 34,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 35,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 36,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 37,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 38,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 39,
-        "test": "content_browsertests",
-        "total_shards": 60
-      }
-    ]
-  },
-  "Windows Content Browser (DrMemory full) (5)": {
-    "gtest_tests": [
-      {
-        "shard_index": 40,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 41,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 42,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 43,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 44,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 45,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 46,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 47,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 48,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 49,
-        "test": "content_browsertests",
-        "total_shards": 60
-      }
-    ]
-  },
-  "Windows Content Browser (DrMemory full) (6)": {
-    "gtest_tests": [
-      {
-        "shard_index": 50,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 51,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 52,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 53,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 54,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 55,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 56,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 57,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 58,
-        "test": "content_browsertests",
-        "total_shards": 60
-      },
-      {
-        "shard_index": 59,
-        "test": "content_browsertests",
-        "total_shards": 60
-      }
-    ]
-  },
-  "Windows Content Browser (DrMemory)": {
-    "gtest_tests": [
-      {
-        "test": "content_browsertests"
-      }
-    ]
-  },
-  "Windows Unit (DrMemory full) (1)": {
-    "gtest_tests": [
-      {
-        "test": "mojo_common_unittests"
-      },
-      {
-        "test": "mojo_public_bindings_unittests"
-      },
-      {
-        "test": "mojo_public_system_unittests"
-      },
-      {
-        "test": "mojo_system_unittests"
-      },
-      {
-        "shard_index": 0,
-        "test": "net_unittests",
-        "total_shards": 2
-      },
-      {
-        "shard_index": 1,
-        "test": "net_unittests",
-        "total_shards": 2
-      }
-    ]
-  },
-  "Windows Unit (DrMemory full) (2)": {
-    "gtest_tests": [
-      {
-        "test": "base_unittests"
-      },
-      {
-        "test": "capture_unittests"
-      },
-      {
-        "test": "media_unittests"
-      },
-      {
-        "test": "midi_unittests"
-      },
-      {
-        "shard_index": 0,
-        "test": "unit_tests",
-        "total_shards": 6
-      },
-      {
-        "shard_index": 1,
-        "test": "unit_tests",
-        "total_shards": 6
-      }
-    ]
-  },
-  "Windows Unit (DrMemory full) (3)": {
-    "gtest_tests": [
-      {
-        "test": "cacheinvalidation_unittests"
-      },
-      {
-        "test": "content_unittests"
-      },
-      {
-        "test": "crypto_unittests"
-      },
-      {
-        "test": "device_unittests"
-      },
-      {
-        "test": "gcm_unit_tests"
-      },
-      {
-        "test": "gpu_ipc_service_unittests"
-      },
-      {
-        "test": "gpu_unittests"
-      },
-      {
-        "test": "ipc_tests"
-      },
-      {
-        "test": "jingle_unittests"
-      },
-      {
-        "test": "libaddressinput_unittests"
-      },
-      {
-        "test": "pdf_unittests"
-      },
-      {
-        "test": "printing_unittests"
-      },
-      {
-        "test": "remoting_unittests"
-      },
-      {
-        "test": "sql_unittests"
-      },
-      {
-        "test": "storage_unittests"
-      },
-      {
-        "shard_index": 2,
-        "test": "unit_tests",
-        "total_shards": 6
-      },
-      {
-        "shard_index": 3,
-        "test": "unit_tests",
-        "total_shards": 6
-      },
-      {
-        "test": "url_unittests"
-      }
-    ]
-  },
-  "Windows Unit (DrMemory full) (4)": {
-    "gtest_tests": [
-      {
-        "test": "libphonenumber_unittests"
-      },
-      {
-        "shard_index": 4,
-        "test": "unit_tests",
-        "total_shards": 6
-      },
-      {
-        "shard_index": 5,
-        "test": "unit_tests",
-        "total_shards": 6
-      }
-    ]
-  },
-  "Windows Unit (DrMemory full) (5)": {
-    "gtest_tests": [
-      {
-        "test": "accessibility_unittests"
-      },
-      {
-        "test": "angle_unittests"
-      },
-      {
-        "test": "aura_unittests"
-      },
-      {
-        "test": "blink_heap_unittests"
-      },
-      {
-        "test": "blink_platform_unittests"
-      },
-      {
-        "test": "cast_unittests"
-      },
-      {
-        "test": "cc_unittests"
-      },
-      {
-        "test": "chrome_app_unittests"
-      },
-      {
-        "test": "chrome_elf_unittests"
-      },
-      {
-        "test": "chromedriver_unittests"
-      },
-      {
-        "test": "compositor_unittests"
-      },
-      {
-        "test": "courgette_unittests"
-      },
-      {
-        "test": "display_unittests"
-      },
-      {
-        "test": "events_unittests"
-      },
-      {
-        "test": "extensions_unittests"
-      },
-      {
-        "test": "gfx_unittests"
-      },
-      {
-        "test": "gin_unittests"
-      },
-      {
-        "test": "google_apis_unittests"
-      },
-      {
-        "test": "installer_util_unittests"
-      },
-      {
-        "test": "install_static_unittests"
-      },
-      {
-        "test": "keyboard_unittests"
-      },
-      {
-        "test": "latency_unittests"
-      }
-    ]
-  },
-  "Windows Unit (DrMemory x64)": {
-    "gtest_tests": [
-      {
-        "test": "accessibility_unittests"
-      },
-      {
-        "test": "angle_unittests"
-      },
-      {
-        "test": "aura_unittests"
-      },
-      {
-        "test": "base_unittests"
-      },
-      {
-        "test": "blink_heap_unittests"
-      },
-      {
-        "test": "blink_platform_unittests"
-      },
-      {
-        "test": "cacheinvalidation_unittests"
-      },
-      {
-        "test": "capture_unittests"
-      },
-      {
-        "test": "cast_unittests"
-      },
-      {
-        "test": "cc_unittests"
-      },
-      {
-        "test": "chrome_app_unittests"
-      },
-      {
-        "test": "chrome_elf_unittests"
-      },
-      {
-        "test": "chromedriver_unittests"
-      },
-      {
-        "test": "components_unittests"
-      },
-      {
-        "test": "compositor_unittests"
-      },
-      {
-        "test": "content_unittests"
-      },
-      {
-        "test": "courgette_unittests"
-      },
-      {
-        "test": "crypto_unittests"
-      },
-      {
-        "test": "device_unittests"
-      },
-      {
-        "test": "display_unittests"
-      },
-      {
-        "test": "events_unittests"
-      },
-      {
-        "test": "extensions_unittests"
-      },
-      {
-        "test": "gcm_unit_tests"
-      },
-      {
-        "test": "gfx_unittests"
-      },
-      {
-        "test": "gin_unittests"
-      },
-      {
-        "test": "google_apis_unittests"
-      },
-      {
-        "test": "gpu_ipc_service_unittests"
-      },
-      {
-        "test": "gpu_unittests"
-      },
-      {
-        "test": "installer_util_unittests"
-      },
-      {
-        "test": "install_static_unittests"
-      },
-      {
-        "test": "ipc_tests"
-      },
-      {
-        "test": "jingle_unittests"
-      },
-      {
-        "test": "keyboard_unittests"
-      },
-      {
-        "test": "libaddressinput_unittests"
-      },
-      {
-        "test": "libphonenumber_unittests"
-      },
-      {
-        "test": "media_unittests"
-      },
-      {
-        "test": "midi_unittests"
-      },
-      {
-        "test": "mojo_common_unittests"
-      },
-      {
-        "test": "mojo_public_bindings_unittests"
-      },
-      {
-        "test": "mojo_public_system_unittests"
-      },
-      {
-        "test": "mojo_system_unittests"
-      },
-      {
-        "test": "net_unittests"
-      },
-      {
-        "test": "pdf_unittests"
-      },
-      {
-        "test": "printing_unittests"
-      },
-      {
-        "test": "remoting_unittests"
-      },
-      {
-        "test": "sql_unittests"
-      },
-      {
-        "test": "storage_unittests"
-      },
-      {
-        "test": "unit_tests"
-      },
-      {
-        "test": "url_unittests"
-      }
-    ]
-  },
-  "Windows Unit (DrMemory)": {
-    "gtest_tests": [
-      {
-        "test": "accessibility_unittests"
-      },
-      {
-        "test": "angle_unittests"
-      },
-      {
-        "test": "aura_unittests"
-      },
-      {
-        "test": "base_unittests"
-      },
-      {
-        "test": "blink_heap_unittests"
-      },
-      {
-        "test": "blink_platform_unittests"
-      },
-      {
-        "test": "cacheinvalidation_unittests"
-      },
-      {
-        "test": "capture_unittests"
-      },
-      {
-        "test": "cast_unittests"
-      },
-      {
-        "test": "cc_unittests"
-      },
-      {
-        "test": "chrome_elf_unittests"
-      },
-      {
-        "test": "chromedriver_unittests"
-      },
-      {
-        "test": "components_unittests"
-      },
-      {
-        "test": "compositor_unittests"
-      },
-      {
-        "test": "content_unittests"
-      },
-      {
-        "test": "courgette_unittests"
-      },
-      {
-        "test": "crypto_unittests"
-      },
-      {
-        "test": "device_unittests"
-      },
-      {
-        "test": "display_unittests"
-      },
-      {
-        "test": "events_unittests"
-      },
-      {
-        "test": "extensions_unittests"
-      },
-      {
-        "test": "gcm_unit_tests"
-      },
-      {
-        "test": "gfx_unittests"
-      },
-      {
-        "test": "gin_unittests"
-      },
-      {
-        "test": "google_apis_unittests"
-      },
-      {
-        "test": "gpu_ipc_service_unittests"
-      },
-      {
-        "test": "gpu_unittests"
-      },
-      {
-        "test": "installer_util_unittests"
-      },
-      {
-        "test": "install_static_unittests"
-      },
-      {
-        "test": "ipc_tests"
-      },
-      {
-        "test": "jingle_unittests"
-      },
-      {
-        "test": "keyboard_unittests"
-      },
-      {
-        "test": "media_unittests"
-      },
-      {
-        "test": "midi_unittests"
-      },
-      {
-        "test": "mojo_common_unittests"
-      },
-      {
-        "test": "mojo_public_bindings_unittests"
-      },
-      {
-        "test": "mojo_public_system_unittests"
-      },
-      {
-        "test": "mojo_system_unittests"
-      },
-      {
-        "test": "net_unittests"
-      },
-      {
-        "test": "pdf_unittests"
-      },
-      {
-        "test": "printing_unittests"
-      },
-      {
-        "test": "remoting_unittests"
-      },
-      {
-        "test": "sql_unittests"
-      },
-      {
-        "test": "storage_unittests"
-      },
-      {
-        "test": "unit_tests"
-      },
-      {
-        "test": "url_unittests"
-      }
-    ]
-  }
-}
diff --git a/testing/buildbot/chromium.perf.fyi.json b/testing/buildbot/chromium.perf.fyi.json
index 5521ff7..4fcfca8 100644
--- a/testing/buildbot/chromium.perf.fyi.json
+++ b/testing/buildbot/chromium.perf.fyi.json
@@ -1,4995 +1,6 @@
 {
   "AAAAA1 AUTOGENERATED FILE DO NOT EDIT": {},
-  "AAAAA2 See //tools/perf/generate_perf_data.py to make changes": {},
-  "Android Swarming N5X Tester": {
-    "isolated_scripts": [
-      {
-        "args": [
-          "battor.steady_state",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "battor.steady_state",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device6",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "battor.steady_state",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "battor.steady_state.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device6",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "battor.trivial_pages",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "battor.trivial_pages",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device1",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "battor.trivial_pages",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "battor.trivial_pages.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device1",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.bindings",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.bindings",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device4",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.bindings",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.bindings.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device4",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.canvas",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.canvas",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device4",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.canvas",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.canvas.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device4",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.css",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.css",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device5",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.css",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.css.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device5",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.dom",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.dom",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device4",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.dom",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.dom.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device4",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.events",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.events",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device2",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.events",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.events.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device2",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.layout",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.layout",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device5",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.layout",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.layout.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device5",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.paint",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.paint",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device6",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.paint",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.paint.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device6",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.parser",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.parser",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device5",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.parser",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.parser.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device5",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.shadow_dom",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.shadow_dom",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build245-m4--device7",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.shadow_dom",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.shadow_dom.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build245-m4--device7",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.svg",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.svg",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device6",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.svg",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.svg.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device6",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "dromaeo.domcoreattr",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "dromaeo.domcoreattr",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device5",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "dromaeo.domcoreattr",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "dromaeo.domcoreattr.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device5",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "dromaeo.domcoremodify",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "dromaeo.domcoremodify",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device3",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "dromaeo.domcoremodify",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "dromaeo.domcoremodify.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device3",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "dromaeo.domcorequery",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "dromaeo.domcorequery",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build245-m4--device7",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "dromaeo.domcorequery",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "dromaeo.domcorequery.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build245-m4--device7",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "dromaeo.domcoretraverse",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "dromaeo.domcoretraverse",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build245-m4--device6",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "dromaeo.domcoretraverse",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "dromaeo.domcoretraverse.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build245-m4--device6",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "dummy_benchmark.noisy_benchmark_1",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "dummy_benchmark.noisy_benchmark_1",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device2",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "dummy_benchmark.noisy_benchmark_1",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "dummy_benchmark.noisy_benchmark_1.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device2",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "dummy_benchmark.stable_benchmark_1",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "dummy_benchmark.stable_benchmark_1",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device2",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "dummy_benchmark.stable_benchmark_1",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "dummy_benchmark.stable_benchmark_1.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device2",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "image_decoding.image_decoding_measurement",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "image_decoding.image_decoding_measurement",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device7",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "image_decoding.image_decoding_measurement",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "image_decoding.image_decoding_measurement.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device7",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "jetstream",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "jetstream",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device2",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "jetstream",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "jetstream.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device2",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "kraken",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "kraken",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device6",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "kraken",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "kraken.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device6",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "loading.mobile",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "loading.mobile",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device1",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 16200,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "loading.mobile",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "loading.mobile.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device1",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 16200,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "media.android.tough_video_cases",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "media.android.tough_video_cases",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device6",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "media.android.tough_video_cases",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "media.android.tough_video_cases.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device6",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "media.android.tough_video_cases_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "media.android.tough_video_cases_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device1",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "media.android.tough_video_cases_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "media.android.tough_video_cases_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device1",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "media.mse_cases",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "media.mse_cases",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device7",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "media.mse_cases",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "media.mse_cases.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device7",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "memory.blink_memory_mobile",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "memory.blink_memory_mobile",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build245-m4--device7",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "memory.blink_memory_mobile",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "memory.blink_memory_mobile.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build245-m4--device7",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "memory.long_running_idle_gmail_background_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "memory.long_running_idle_gmail_background_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device6",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "memory.long_running_idle_gmail_background_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "memory.long_running_idle_gmail_background_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device6",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "memory.long_running_idle_gmail_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "memory.long_running_idle_gmail_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device7",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "memory.long_running_idle_gmail_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "memory.long_running_idle_gmail_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device7",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "memory.top_10_mobile",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "memory.top_10_mobile",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device3",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "memory.top_10_mobile",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "memory.top_10_mobile.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device3",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "octane",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "octane",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device1",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "octane",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "octane.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device1",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "oortonline_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "oortonline_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device5",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "oortonline_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "oortonline_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device5",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "power.idle_platform",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "power.idle_platform",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build245-m4--device7",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "power.steady_state",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "power.steady_state",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device6",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "power.steady_state",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "power.steady_state.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device6",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "power.trivial_pages",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "power.trivial_pages",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device2",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "power.trivial_pages",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "power.trivial_pages.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device2",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "power.typical_10_mobile",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "power.typical_10_mobile",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build245-m4--device6",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "power.typical_10_mobile",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "power.typical_10_mobile.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build245-m4--device6",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "scheduler.tough_scheduling_cases",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "scheduler.tough_scheduling_cases",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device5",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "scheduler.tough_scheduling_cases",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "scheduler.tough_scheduling_cases.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device5",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "service_worker.service_worker",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "service_worker.service_worker",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device1",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "service_worker.service_worker",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "service_worker.service_worker.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device1",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "service_worker.service_worker_micro_benchmark",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "service_worker.service_worker_micro_benchmark",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device7",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "service_worker.service_worker_micro_benchmark",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "service_worker.service_worker_micro_benchmark.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device7",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "smoothness.desktop_tough_pinch_zoom_cases",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "smoothness.desktop_tough_pinch_zoom_cases",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device7",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "smoothness.desktop_tough_pinch_zoom_cases",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "smoothness.desktop_tough_pinch_zoom_cases.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device7",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "smoothness.gpu_rasterization.polymer",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "smoothness.gpu_rasterization.polymer",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device4",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "smoothness.gpu_rasterization.polymer",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "smoothness.gpu_rasterization.polymer.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device4",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "smoothness.gpu_rasterization.top_25_smooth",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "smoothness.gpu_rasterization.top_25_smooth",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device6",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "smoothness.gpu_rasterization.top_25_smooth",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "smoothness.gpu_rasterization.top_25_smooth.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device6",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "smoothness.gpu_rasterization.tough_filters_cases",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "smoothness.gpu_rasterization.tough_filters_cases",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device3",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "smoothness.gpu_rasterization.tough_filters_cases",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "smoothness.gpu_rasterization.tough_filters_cases.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device3",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "smoothness.gpu_rasterization.tough_path_rendering_cases",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "smoothness.gpu_rasterization.tough_path_rendering_cases",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device6",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "smoothness.gpu_rasterization.tough_path_rendering_cases",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "smoothness.gpu_rasterization.tough_path_rendering_cases.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device6",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "smoothness.key_mobile_sites_smooth",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "smoothness.key_mobile_sites_smooth",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device6",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "smoothness.key_mobile_sites_smooth",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "smoothness.key_mobile_sites_smooth.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device6",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "smoothness.key_silk_cases",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "smoothness.key_silk_cases",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build245-m4--device1",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "smoothness.key_silk_cases",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "smoothness.key_silk_cases.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build245-m4--device1",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "smoothness.maps",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "smoothness.maps",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device5",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "smoothness.maps",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "smoothness.maps.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device5",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "smoothness.pathological_mobile_sites",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "smoothness.pathological_mobile_sites",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device3",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "smoothness.pathological_mobile_sites",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "smoothness.pathological_mobile_sites.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device3",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "smoothness.simple_mobile_sites",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "smoothness.simple_mobile_sites",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build245-m4--device2",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "smoothness.simple_mobile_sites",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "smoothness.simple_mobile_sites.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build245-m4--device2",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "smoothness.sync_scroll.key_mobile_sites_smooth",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "smoothness.sync_scroll.key_mobile_sites_smooth",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device3",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "smoothness.sync_scroll.key_mobile_sites_smooth",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "smoothness.sync_scroll.key_mobile_sites_smooth.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device3",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "smoothness.top_25_smooth",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "smoothness.top_25_smooth",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device2",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "smoothness.top_25_smooth",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "smoothness.top_25_smooth.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device2",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "smoothness.tough_ad_cases",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "smoothness.tough_ad_cases",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device2",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "smoothness.tough_ad_cases",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "smoothness.tough_ad_cases.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device2",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "smoothness.tough_filters_cases",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "smoothness.tough_filters_cases",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device1",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "smoothness.tough_filters_cases",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "smoothness.tough_filters_cases.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device1",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "smoothness.tough_path_rendering_cases",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "smoothness.tough_path_rendering_cases",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device7",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "smoothness.tough_path_rendering_cases",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "smoothness.tough_path_rendering_cases.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device7",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "smoothness.tough_scrolling_cases",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "smoothness.tough_scrolling_cases",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device7",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "smoothness.tough_scrolling_cases",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "smoothness.tough_scrolling_cases.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device7",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "smoothness.tough_texture_upload_cases",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "smoothness.tough_texture_upload_cases",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device2",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "smoothness.tough_texture_upload_cases",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "smoothness.tough_texture_upload_cases.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device2",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "smoothness.tough_webgl_ad_cases",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "smoothness.tough_webgl_ad_cases",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device1",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "smoothness.tough_webgl_ad_cases",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "smoothness.tough_webgl_ad_cases.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device1",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "speedometer",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device2",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "speedometer",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device2",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "speedometer2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device2",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "speedometer2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device2",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "start_with_url.cold.startup_pages",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "start_with_url.cold.startup_pages",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device4",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "start_with_url.cold.startup_pages",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "start_with_url.cold.startup_pages.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device4",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "start_with_url.warm.startup_pages",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "start_with_url.warm.startup_pages",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device5",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "start_with_url.warm.startup_pages",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "start_with_url.warm.startup_pages.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device5",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "startup.cold.blank_page",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "startup.cold.blank_page",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device6",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "startup.cold.blank_page",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "startup.cold.blank_page.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device6",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "startup.large_profile.cold.blank_page",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "startup.large_profile.cold.blank_page",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device3",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "startup.large_profile.cold.blank_page",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "startup.large_profile.cold.blank_page.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device3",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "startup.large_profile.warm.blank_page",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "startup.large_profile.warm.blank_page",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device2",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "startup.large_profile.warm.blank_page",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "startup.large_profile.warm.blank_page.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device2",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "startup.warm.blank_page",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "startup.warm.blank_page",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device4",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "startup.warm.blank_page",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "startup.warm.blank_page.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device4",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "storage.indexeddb_endure",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "storage.indexeddb_endure",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device4",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "storage.indexeddb_endure",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "storage.indexeddb_endure.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device4",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "storage.indexeddb_endure_tracing",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "storage.indexeddb_endure_tracing",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device3",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "storage.indexeddb_endure_tracing",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "storage.indexeddb_endure_tracing.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device3",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "system_health.common_mobile",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "system_health.common_mobile",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device7",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "system_health.common_mobile",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "system_health.common_mobile.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device7",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "system_health.memory_mobile",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "system_health.memory_mobile",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build245-m4--device1",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "system_health.memory_mobile",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "system_health.memory_mobile.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build245-m4--device1",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "system_health.webview_startup",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "system_health.webview_startup",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device4",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "system_health.webview_startup",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "system_health.webview_startup.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device4",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "tab_switching.typical_25",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "tab_switching.typical_25",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device1",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "tab_switching.typical_25",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "tab_switching.typical_25.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device1",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "thread_times.key_hit_test_cases",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "thread_times.key_hit_test_cases",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device1",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "thread_times.key_hit_test_cases",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "thread_times.key_hit_test_cases.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device1",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "thread_times.key_idle_power_cases",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "thread_times.key_idle_power_cases",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device1",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "thread_times.key_idle_power_cases",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "thread_times.key_idle_power_cases.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device1",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "thread_times.key_mobile_sites_smooth",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "thread_times.key_mobile_sites_smooth",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build245-m4--device6",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "thread_times.key_mobile_sites_smooth",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "thread_times.key_mobile_sites_smooth.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build245-m4--device6",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "thread_times.key_noop_cases",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "thread_times.key_noop_cases",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device6",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "thread_times.key_noop_cases",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "thread_times.key_noop_cases.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device6",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "thread_times.key_silk_cases",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "thread_times.key_silk_cases",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device4",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "thread_times.key_silk_cases",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "thread_times.key_silk_cases.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device4",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "thread_times.polymer",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "thread_times.polymer",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device6",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "thread_times.polymer",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "thread_times.polymer.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device6",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "thread_times.simple_mobile_sites",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "thread_times.simple_mobile_sites",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device5",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "thread_times.simple_mobile_sites",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "thread_times.simple_mobile_sites.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device5",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "thread_times.tough_compositor_cases",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "thread_times.tough_compositor_cases",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device3",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "thread_times.tough_compositor_cases",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "thread_times.tough_compositor_cases.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device3",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "thread_times.tough_scrolling_cases",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "thread_times.tough_scrolling_cases",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device3",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "thread_times.tough_scrolling_cases",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "thread_times.tough_scrolling_cases.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device3",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "tracing.tracing_with_background_memory_infra",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "tracing.tracing_with_background_memory_infra",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device6",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "tracing.tracing_with_background_memory_infra",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "tracing.tracing_with_background_memory_infra.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device6",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "tracing.tracing_with_debug_overhead",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "tracing.tracing_with_debug_overhead",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device1",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "tracing.tracing_with_debug_overhead",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "tracing.tracing_with_debug_overhead.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device1",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.browsing_mobile",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_mobile",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build245-m4--device5",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.browsing_mobile",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_mobile.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build245-m4--device5",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.detached_context_age_in_gc",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.detached_context_age_in_gc",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device3",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.detached_context_age_in_gc",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.detached_context_age_in_gc.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device3",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.runtimestats.browsing_mobile",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_mobile",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device1",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.runtimestats.browsing_mobile",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_mobile.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device1",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "webrtc",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "webrtc",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build245-m4--device6",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "webrtc",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "webrtc.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build245-m4--device6",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      }
-    ]
-  },
+  "AAAAA2 See //tools/perf/generate_perf_data to make changes": {},
   "Mojo Linux Perf": {
     "isolated_scripts": [
       {
diff --git a/testing/buildbot/chromium.perf.json b/testing/buildbot/chromium.perf.json
index ff8d6d7..972bdc1 100644
--- a/testing/buildbot/chromium.perf.json
+++ b/testing/buildbot/chromium.perf.json
@@ -1,6 +1,6 @@
 {
   "AAAAA1 AUTOGENERATED FILE DO NOT EDIT": {},
-  "AAAAA2 See //tools/perf/generate_perf_data.py to make changes": {},
+  "AAAAA2 See //tools/perf/generate_perf_data to make changes": {},
   "Android Compile": {
     "additional_compile_targets": [
       "microdump_stackwalk"
diff --git a/testing/buildbot/chromium.win.json b/testing/buildbot/chromium.win.json
index de45ea8..bd2b670 100644
--- a/testing/buildbot/chromium.win.json
+++ b/testing/buildbot/chromium.win.json
@@ -497,16 +497,6 @@
       }
     ]
   },
-  "Win x64 GN": {
-    "additional_compile_targets": [
-      "base_unittests"
-    ]
-  },
-  "Win x64 GN (dbg)": {
-    "additional_compile_targets": [
-      "base_unittests"
-    ]
-  },
   "Win10 Tests x64": {
     "gtest_tests": [
       {
@@ -2049,15 +2039,5 @@
         }
       }
     ]
-  },
-  "Win8 GYP": {
-    "additional_compile_targets": [
-      "chrome_official_builder"
-    ]
-  },
-  "Win8 GYP (dbg)": {
-    "additional_compile_targets": [
-      "all"
-    ]
   }
 }
diff --git a/testing/buildbot/chromium_memory_trybot.json b/testing/buildbot/chromium_memory_trybot.json
deleted file mode 100644
index 33c9c86..0000000
--- a/testing/buildbot/chromium_memory_trybot.json
+++ /dev/null
@@ -1,145 +0,0 @@
-{
-  "gtest_tests": [
-    "accessibility_unittests",
-    {
-      "swarming": {
-        "can_use_on_swarming_builders": true
-      },
-      "test": "base_unittests"
-    },
-    {
-      "swarming": {
-        "can_use_on_swarming_builders": true,
-        "shards": 10
-      },
-      "test": "browser_tests"
-    },
-    "cacheinvalidation_unittests",
-    {
-      "swarming": {
-        "can_use_on_swarming_builders": true
-      },
-      "test": "capture_unittests"
-    },
-    {
-      "swarming": {
-        "can_use_on_swarming_builders": true
-      },
-      "test": "cc_unittests"
-    },
-    {
-      "swarming": {
-        "can_use_on_swarming_builders": true
-      },
-      "test": "components_browsertests"
-    },
-    {
-      "swarming": {
-        "can_use_on_swarming_builders": true
-      },
-      "test": "components_unittests"
-    },
-    {
-      "swarming": {
-        "can_use_on_swarming_builders": true
-      },
-      "test": "content_browsertests"
-    },
-    {
-      "swarming": {
-        "can_use_on_swarming_builders": true
-      },
-      "test": "content_unittests"
-    },
-    {
-      "swarming": {
-        "can_use_on_swarming_builders": true
-      },
-      "test": "crypto_unittests"
-    },
-    "device_unittests",
-    {
-      "platforms": [
-        "linux"
-      ],
-      "test": "display_unittests"
-    },
-    "extensions_unittests",
-    "gcm_unit_tests",
-    "gfx_unittests",
-    "google_apis_unittests",
-    {
-      "swarming": {
-        "can_use_on_swarming_builders": true
-      },
-      "test": "gpu_ipc_service_unittests"
-    },
-    {
-      "swarming": {
-        "can_use_on_swarming_builders": true
-      },
-      "test": "gpu_unittests"
-    },
-    {
-      "swarming": {
-        "can_use_on_swarming_builders": true,
-        "shards": 3
-      },
-      "test": "interactive_ui_tests"
-    },
-    "ipc_tests",
-    "jingle_unittests",
-    {
-      "swarming": {
-        "can_use_on_swarming_builders": true
-      },
-      "test": "media_unittests"
-    },
-    {
-      "swarming": {
-        "can_use_on_swarming_builders": true
-      },
-      "test": "media_blink_unittests"
-    },
-    {
-      "swarming": {
-        "can_use_on_swarming_builders": true
-      },
-      "test": "midi_unittests"
-    },
-    {
-      "swarming": {
-        "can_use_on_swarming_builders": true,
-        "shards": 2
-      },
-      "test": "net_unittests"
-    },
-    "pdf_unittests",
-    "ppapi_unittests",
-    "printing_unittests",
-    "remoting_unittests",
-    {
-      "platforms": [
-        "linux"
-      ],
-      "test": "sandbox_linux_unittests"
-    },
-    "skia_unittests",
-    "sql_unittests",
-    {
-      "swarming": {
-        "can_use_on_swarming_builders": true
-      },
-      "test": "storage_unittests"
-    },
-    "ui_base_unittests",
-    {
-      "swarming": {
-        "can_use_on_swarming_builders": true,
-        "shards": 2
-      },
-      "test": "unit_tests"
-    },
-    "url_unittests"
-  ]
-}
diff --git a/testing/buildbot/chromium_win8_trybot.json b/testing/buildbot/chromium_win8_trybot.json
deleted file mode 100644
index 963a3ff..0000000
--- a/testing/buildbot/chromium_win8_trybot.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-  "compile_targets": [
-    "all"
-  ],
-  "gtest_tests": [
-    "base_unittests",
-    "views_unittests",
-    "wm_unittests",
-    "aura_unittests",
-    "compositor_unittests",
-    "content_browsertests",
-    "events_unittests",
-    "ui_touch_selection_unittests",
-    "sbox_integration_tests",
-    "sbox_validation_tests",
-    "sbox_unittests"
-  ]
-}
diff --git a/testing/buildbot/filters/mojo.fyi.network_content_browsertests.filter b/testing/buildbot/filters/mojo.fyi.network_content_browsertests.filter
index 19fa3da..b875db1 100644
--- a/testing/buildbot/filters/mojo.fyi.network_content_browsertests.filter
+++ b/testing/buildbot/filters/mojo.fyi.network_content_browsertests.filter
@@ -88,6 +88,7 @@
 -NavigationControllerBrowserTest.NoDialogsFromSwappedOutFrames
 -NavigationControllerBrowserTest.RefererStoredForSubFrame
 -NavigationHandleImplBrowserTest.ErrorCodeOnRedirect
+-NavigationHandleImplBrowserTest.RedirectToRendererDebugUrl
 -ParallelDownloadTest.ParallelDownloadComplete
 -PaymentAppBrowserTest.PaymentAppInvocation
 -PaymentAppBrowserTest.PaymentAppOpenWindowFailed
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl
index 479680b..7ec3ea0 100644
--- a/testing/buildbot/gn_isolate_map.pyl
+++ b/testing/buildbot/gn_isolate_map.pyl
@@ -636,20 +636,10 @@
     "label": "//components/leveldb:leveldb_service_unittests",
     "type": "console_test_launcher",
   },
-  # See http://crbug.com/585151
-  "libaddressinput_unittests": {
-    "label": "//third_party/libaddressinput:libaddressinput_unittests",
-    "type": "console_test_launcher",
-  },
   "libjingle_xmpp_unittests": {
     "label": "//third_party/libjingle_xmpp:libjingle_xmpp_unittests",
     "type": "console_test_launcher",
   },
-  # See http://crbug.com/585151
-  "libphonenumber_unittests": {
-    "label": "//third_party/libphonenumber:libphonenumber_unittests",
-    "type": "console_test_launcher",
-  },
   "mac_installer_unittests": {
     "label": "//chrome/installer/mac/app:mac_installer_unittests",
     "type": "console_test_launcher",
diff --git a/testing/buildbot/manage.py b/testing/buildbot/manage.py
index 3a8fafe..ec9c2edf 100755
--- a/testing/buildbot/manage.py
+++ b/testing/buildbot/manage.py
@@ -69,61 +69,6 @@
   'WebKit Mac10.11 (retina)',
   'Chromium Mac10.10 Tests',
   'Chromium Mac10.11 Tests',
-  'Mac GN',
-  'Mac GN (dbg)',
-
-  # The memory.fyi waterfall is in the process of being converted to recipes,
-  # and swarming doesn't work yet.
-  'Chromium Mac (valgrind)(1)',
-  'Chromium Mac (valgrind)(2)',
-  'Chromium OS (valgrind)(1)',
-  'Chromium OS (valgrind)(2)',
-  'Chromium OS (valgrind)(3)',
-  'Chromium OS (valgrind)(4)',
-  'Chromium OS (valgrind)(5)',
-  'Chromium OS (valgrind)(6)',
-  'Linux Tests (valgrind)(1)',
-  'Linux Tests (valgrind)(2)',
-  'Linux Tests (valgrind)(3)',
-  'Linux Tests (valgrind)(4)',
-  'Linux Tests (valgrind)(5)',
-  'Windows Browser (DrMemory full) (1)',
-  'Windows Browser (DrMemory full) (2)',
-  'Windows Browser (DrMemory full) (3)',
-  'Windows Browser (DrMemory full) (4)',
-  'Windows Browser (DrMemory full) (5)',
-  'Windows Browser (DrMemory full) (6)',
-  'Windows Browser (DrMemory full) (7)',
-  'Windows Browser (DrMemory full) (8)',
-  'Windows Browser (DrMemory full) (9)',
-  'Windows Browser (DrMemory full) (10)',
-  'Windows Browser (DrMemory full) (11)',
-  'Windows Browser (DrMemory full) (12)',
-  'Windows Content Browser (DrMemory)',
-  'Windows Content Browser (DrMemory full) (1)',
-  'Windows Content Browser (DrMemory full) (2)',
-  'Windows Content Browser (DrMemory full) (3)',
-  'Windows Content Browser (DrMemory full) (4)',
-  'Windows Content Browser (DrMemory full) (5)',
-  'Windows Content Browser (DrMemory full) (6)',
-  'Windows Unit (DrMemory full) (1)',
-  'Windows Unit (DrMemory full) (2)',
-  'Windows Unit (DrMemory full) (3)',
-  'Windows Unit (DrMemory full) (4)',
-  'Windows Unit (DrMemory full) (5)',
-  'Windows Unit (DrMemory full) (6)',
-  'Windows Unit (DrMemory full) (7)',
-  'Windows Unit (DrMemory full) (8)',
-  'Windows Unit (DrMemory full) (9)',
-  'Windows Unit (DrMemory full) (10)',
-  'Windows Unit (DrMemory full) (11)',
-  'Windows Unit (DrMemory full) (12)',
-  'Windows Unit (DrMemory x64)',
-  'Windows Unit (DrMemory)',
-
-  # This builder is fine, but win8_chromium_ng uses GN and this configuration,
-  # which breaks everything.
-  'Win8 Aura',
 
   # One off builders. Note that Swarming does support ARM.
   'Linux ARM Cross-Compile',
@@ -142,6 +87,7 @@
   'blink_tests',
   'cast_shell',
   'cast_shell_apk',
+  'chrome_official_builder',
   'chrome_official_builder_no_unittests',
   'chromium_builder_asan',
   'chromium_builder_perf',
@@ -217,6 +163,10 @@
   # http://crbug.com/524758
   'webkit_layout_tests',
   'webkit_layout_tests_exparchive',
+
+  # These are only run on V8 CI.
+  'pdfium_test',
+  'postmortem-metadata',
 }
 
 
diff --git a/testing/buildbot/tryserver.blink.json b/testing/buildbot/tryserver.blink.json
deleted file mode 100644
index 0967ef4..0000000
--- a/testing/buildbot/tryserver.blink.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
diff --git a/testing/buildbot/tryserver.chromium.linux.json b/testing/buildbot/tryserver.chromium.linux.json
deleted file mode 100644
index 0967ef4..0000000
--- a/testing/buildbot/tryserver.chromium.linux.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
diff --git a/testing/buildbot/tryserver.chromium.mac.json b/testing/buildbot/tryserver.chromium.mac.json
deleted file mode 100644
index 0967ef4..0000000
--- a/testing/buildbot/tryserver.chromium.mac.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
diff --git a/testing/buildbot/tryserver.chromium.perf.json b/testing/buildbot/tryserver.chromium.perf.json
deleted file mode 100644
index 0967ef4..0000000
--- a/testing/buildbot/tryserver.chromium.perf.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
diff --git a/testing/buildbot/tryserver.chromium.win.json b/testing/buildbot/tryserver.chromium.win.json
deleted file mode 100644
index 0967ef4..0000000
--- a/testing/buildbot/tryserver.chromium.win.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
diff --git a/testing/buildbot/tryserver.v8.json b/testing/buildbot/tryserver.v8.json
deleted file mode 100644
index c6a9861..0000000
--- a/testing/buildbot/tryserver.v8.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-  "v8_android_chromium_gn_dbg": {
-    "additional_compile_targets": [
-      "chrome_public_apk"
-    ],
-    "gtest_tests": []
-  },
-  "v8_linux_chromium_gn_rel": {
-    "additional_compile_targets": [
-      "blink_tests",
-      "extensions_browsertests",
-      "gin_unittests",
-      "pdfium_test",
-      "postmortem-metadata",
-      "net_unittests",
-      "unit_tests"
-    ]
-  }
-}
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 79e2c99..6f9940d 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -2797,7 +2797,11 @@
             ],
             "experiments": [
                 {
-                    "name": "Enabled"
+                    "name": "V4Only2",
+                    "enable_features": [
+                        "SafeBrowsingV4LocalDatabaseManagerEnabled",
+                        "SafeBrowsingV4OnlyEnabled"
+                    ]
                 }
             ]
         }
@@ -2828,11 +2832,7 @@
             ],
             "experiments": [
                 {
-                    "name": "V4Only2",
-                    "enable_features": [
-                        "SafeBrowsingV4LocalDatabaseManagerEnabled",
-                        "SafeBrowsingV4OnlyEnabled"
-                    ]
+                    "name": "Enabled"
                 }
             ]
         }
diff --git a/third_party/WebKit/LayoutTests/NeverFixTests b/third_party/WebKit/LayoutTests/NeverFixTests
index f92cde6..d762fa0 100644
--- a/third_party/WebKit/LayoutTests/NeverFixTests
+++ b/third_party/WebKit/LayoutTests/NeverFixTests
@@ -241,8 +241,6 @@
 # wasm tests. Currently under virtual/enable_wasm or virtual/enable_wasm_streaming
 crbug.com/642912 http/tests/wasm/ [ WontFix ]
 crbug.com/642912 virtual/mojo-loading/http/tests/wasm/ [ WontFix ]
-crbug.com/712970 http/tests/wasm_streaming/ [ WontFix ]
-crbug.com/712970 virtual/mojo-loading/http/tests/wasm_streaming/ [ WontFix ]
 
 # These tests require audio codecs which are generally not available;
 # these tests can still be run manually with --skiped=ignore.
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations
index 18700470..da5f1af5 100644
--- a/third_party/WebKit/LayoutTests/TestExpectations
+++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -821,14 +821,6 @@
 
 crbug.com/487281 [ Mac ] fast/forms/select/menulist-narrow-width.html [ Failure ]
 
-# Mark as Failure until the development is done.
-crbug.com/739091 fast/forms/validation-bubble-appearance-edge.html [ Failure ]
-crbug.com/739091 fast/forms/validation-bubble-appearance-iframe.html [ Failure ]
-crbug.com/739091 fast/forms/validation-bubble-appearance-rtl-ui.html [ Failure ]
-crbug.com/739091 virtual/scalefactor150/fast/hidpi/static/validation-bubble-appearance-hidpi.html [ Failure ]
-crbug.com/739091 virtual/scalefactor200/fast/hidpi/static/validation-bubble-appearance-hidpi.html [ Failure ]
-crbug.com/739091 virtual/scalefactor200withzoom/fast/hidpi/static/validation-bubble-appearance-hidpi.html [ Failure ]
-
 crbug.com/543110 [ Mac ] fast/text/international/text-shaping-arabic.html [ Failure ]
 
 crbug.com/731731 inspector-protocol/layers/paint-profiler-load-empty.js [ Failure Pass ]
diff --git a/third_party/WebKit/LayoutTests/fast/css/hover-active-drag-expected.txt b/third_party/WebKit/LayoutTests/fast/css/hover-active-drag-expected.txt
index b11bbfb..23027878 100644
--- a/third_party/WebKit/LayoutTests/fast/css/hover-active-drag-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/css/hover-active-drag-expected.txt
@@ -7,7 +7,7 @@
 PASS background is "rgb(255, 255, 0)"
 PASS background is "rgb(0, 0, 0)"
 PASS background is "rgb(0, 255, 0)"
-PASS background is "rgb(0, 0, 0)"
+PASS background is "rgb(255, 0, 0)"
 PASS background is "rgb(0, 255, 0)"
 PASS background is "rgb(0, 0, 0)"
 PASS background is "rgb(0, 0, 0)"
diff --git a/third_party/WebKit/LayoutTests/fast/css/hover-active-drag.html b/third_party/WebKit/LayoutTests/fast/css/hover-active-drag.html
index dd11864e..a6d1654 100644
--- a/third_party/WebKit/LayoutTests/fast/css/hover-active-drag.html
+++ b/third_party/WebKit/LayoutTests/fast/css/hover-active-drag.html
@@ -49,7 +49,7 @@
     // With the mouse still down, move into the second box.
     eventSender.mouseMoveTo(50, 150)
     shouldHaveBackground(box, 'rgb(0, 255, 0)')
-    shouldHaveBackground(box2, 'rgb(0, 0, 0)')
+    shouldHaveBackground(box2, 'rgb(255, 0, 0)')
 
     // Mouse still down, move outside of both boxes.
     eventSender.mouseMoveTo(400, 50)
diff --git a/third_party/WebKit/LayoutTests/fast/events/no-hover-when-mouse-drag.html b/third_party/WebKit/LayoutTests/fast/events/no-hover-when-mouse-drag.html
new file mode 100644
index 0000000..b943135
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/events/no-hover-when-mouse-drag.html
@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<script src='../../resources/testharness.js'></script>
+<script src='../../resources/testharnessreport.js'></script>
+<style type="text/css">
+.box:hover {background-color: rgb(0, 255, 255);}
+.box:active {background-color: rgb(0, 0, 255);}
+.box:active:hover {background-color: rgb(255, 255, 0);}
+
+.box{border:2px solid #aaa; width:100px; height:100px; background-color: rgb(0, 0, 0);}
+</style>
+
+<body>
+<div class="box" draggable="true" id="upbox"></div>
+<div class="box" id="downbox"></div>
+
+<script type="text/javascript">
+var upbox = document.getElementById("upbox");
+var downbox = document.getElementById("downbox");
+var targetRect = upbox.getBoundingClientRect();
+var offset = 20;
+var x1 = targetRect.left + offset;
+var y1 = targetRect.top + offset;
+targetRect = downbox.getBoundingClientRect();
+var x2 = targetRect.left + offset;
+var y2 = targetRect.top + offset;
+
+
+function mouseDownHandler(event) {
+    testHover.step(function () {
+        assert_equals(event.target.id, "upbox");
+        assert_equals(getComputedStyle(event.target).backgroundColor, "rgb(255, 255, 0)");
+    });
+}
+
+function mouseDragHandler(event) {
+    testHover.step(function () {
+        assert_equals(getComputedStyle(downbox).backgroundColor, "rgb(0, 0, 0)");
+        assert_equals(getComputedStyle(event.target).backgroundColor, "rgb(255, 255, 0)");
+    });
+}
+
+function mouseDragEndHandler(event) {
+    testHover.step(function () {
+        assert_equals(getComputedStyle(downbox).backgroundColor, "rgb(0, 255, 255)");
+        assert_equals(getComputedStyle(upbox).backgroundColor, "rgb(0, 0, 0)");
+    });
+    testHover.done();
+}
+
+function testHoverMouseDrag() {
+    if (window.eventSender) {
+        eventSender.mouseMoveTo(x1, y1);
+        eventSender.mouseDown();
+        eventSender.leapForward(100);
+        eventSender.mouseMoveTo(x1, y1+10);
+        eventSender.mouseMoveTo(x1, y1+20);
+        eventSender.mouseMoveTo(x2, y2);
+        eventSender.mouseUp();
+    }
+}
+
+var testHover = async_test('Tests that we do not update the hover states of any element when we are dragging an element around.');
+upbox.addEventListener('drag', mouseDragHandler);
+upbox.addEventListener('dragend', mouseDragEndHandler);
+upbox.addEventListener('mousedown', mouseDownHandler);
+testHoverMouseDrag();
+
+</script>
+</body>
+
+
diff --git a/third_party/WebKit/LayoutTests/fast/events/update-hover-when-mouse-press.html b/third_party/WebKit/LayoutTests/fast/events/update-hover-when-mouse-press.html
new file mode 100644
index 0000000..b512500
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/events/update-hover-when-mouse-press.html
@@ -0,0 +1,70 @@
+<!DOCTYPE html>
+<script src='../../resources/testharness.js'></script>
+<script src='../../resources/testharnessreport.js'></script>
+<style type="text/css">
+.box:hover{background-color: rgb(0, 255, 255);}
+.box:active{background-color: rgb(0, 0, 255);}
+.box:active:hover{background-color: rgb(255, 255, 0);}
+
+.box{border:2px solid #aaa; width:100px; height:100px;}
+</style>
+
+<body>
+<div class="box" id="upbox"></div>
+<div class="box" id="downbox"></div>
+
+<script type="text/javascript">
+var mouseover = false;
+var mousedown = false;
+var upbox = document.getElementById("upbox");
+var downbox = document.getElementById("downbox");
+var targetRect = downbox.getBoundingClientRect();
+var offset = 20;
+var x1 = targetRect.left + offset;
+var y1 = targetRect.top + offset;
+targetRect = upbox.getBoundingClientRect();
+var x2 = targetRect.left + offset;
+var y2 = targetRect.top + offset;
+
+
+function mouseDownHandler(event) {
+    mouseHoverActive = true;
+    testHover.step(function () {
+        assert_equals(event.target.id, "downbox");
+        assert_equals(getComputedStyle(event.target).backgroundColor, "rgb(255, 255, 0)");
+    });
+}
+
+function mouseOverHandler(event) {
+    mouseHover = true;
+    testHover.step(function () {
+        assert_true(mouseHoverActive);
+        assert_true(mouseHover);
+        assert_equals(event.target.id, "upbox");
+        assert_equals(getComputedStyle(upbox).backgroundColor, "rgb(0, 255, 255)");
+        assert_equals(getComputedStyle(downbox).backgroundColor, "rgb(0, 0, 255)");
+        testHover.done();
+    });
+}
+
+function testHoverMousePress() {
+    if (window.chrome && chrome.gpuBenchmarking) {
+        var pointerActions =
+            [{source: "mouse",
+              actions: [
+                { name: "pointerMove", x: x1, y: y1 },
+                { name: "pointerDown", x: x1, y: y1, button: 'left'},
+                { name: "pointerMove", x: x2, y: y2, button: 'left' }]}];
+        chrome.gpuBenchmarking.pointerActionSequence(pointerActions);
+    }
+}
+
+var testHover = async_test('Test that we update the hover states when we move the mouse to the element while the left button is pressed.');
+upbox.addEventListener('mouseover', mouseOverHandler);
+downbox.addEventListener('mousedown', mouseDownHandler);
+testHoverMousePress();
+
+</script>
+</body>
+
+
diff --git a/third_party/WebKit/LayoutTests/fast/text/ellipsis-in-relative-inline-right.html b/third_party/WebKit/LayoutTests/fast/text/ellipsis-in-relative-inline-right.html
new file mode 100644
index 0000000..8d9ecf6
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/text/ellipsis-in-relative-inline-right.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<style>
+div {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  width: 100px;
+  white-space: pre;
+  font-size: 20px;
+  border: 1px solid black;
+  font-family: arial;
+}
+.rtl {
+    direction: rtl;
+}
+span {
+  position: relative;
+  right: 2em;
+}
+</style>
+<p>crbug.com/737837: Place ellipsis correctly when inline has relative position.</p>
+<p>These should have an ellipsis.</p>
+<div class="rtl"><span>abcdefghijklmnop</span></div>
+<div class="rtl"><span>abcdefghijklm</span></div>
+<div class="rtl"><span>אבגדהוזחטיכךללכךלכךל</span></div>
+<div class="rtl"><span>אבגדהוזחטיכךל</span></div>
+<p>These should have no ellipsis.</p>
+<div><span>abcdefghij</span></div>
+<div><span>abcde</span></div>
+<div><span>אבגדהוזחטיכךל</span></div>
+<div><span>אבגדהו</span></div>
diff --git a/third_party/WebKit/LayoutTests/fast/text/ellipsis-in-relative-inline.html b/third_party/WebKit/LayoutTests/fast/text/ellipsis-in-relative-inline.html
new file mode 100644
index 0000000..0bb6afce
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/text/ellipsis-in-relative-inline.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<style>
+div {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  width: 100px;
+  white-space: pre;
+  font-size: 20px;
+  border: 1px solid black;
+  font-family: arial;
+}
+.rtl {
+    direction: rtl;
+}
+span {
+  position: relative;
+  left: 2em;
+}
+</style>
+<p>crbug.com/737837: Place ellipsis correctly when inline has relative position.</p>
+<div><span>abcdefghij</span></div>
+<div class="rtl"><span>abcdefghijklmnop</span></div>
+<div><span>אבגדהוזחטיכךל</span></div>
+<div class="rtl"><span>אבגדהוזחטיכךללכךלכךל</span></div>
+<p>These should have no ellipsis.</p>
+<div><span>abcde</span></div>
+<div class="rtl"><span>abcdefghijklm</span></div>
+<div><span>אבגדהו</span></div>
+<div class="rtl"><span>אבגדהוזחטיכךל</span></div>
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/devtools-js/.clang-format b/third_party/WebKit/LayoutTests/http/tests/inspector/devtools-js/.clang-format
new file mode 100644
index 0000000..ea647be
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector/devtools-js/.clang-format
@@ -0,0 +1,8 @@
+---
+BasedOnStyle: Chromium
+Language: JavaScript
+ColumnLimit: 120
+CommentPragmas: .*\@.*
+AllowShortBlocksOnASingleLine: false
+AllowShortFunctionsOnASingleLine: None
+ReflowComments: false
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/devtools-js/console/command-line-api-expected.txt b/third_party/WebKit/LayoutTests/http/tests/inspector/devtools-js/console/command-line-api-expected.txt
new file mode 100644
index 0000000..b82911a
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector/devtools-js/console/command-line-api-expected.txt
@@ -0,0 +1,39 @@
+Tests that command line api works.
+
+
+String($0)
+"[object HTMLParagraphElement]"
+
+$3
+undefined
+
+String(keys([3,4]))
+"0,1"
+
+String(values([3,4]))
+"3,4"
+
+String($('#foo'))
+"[object HTMLParagraphElement]"
+
+String($('#foo', document.body))
+"[object HTMLParagraphElement]"
+
+String($('#foo', 'non-node'))
+"[object HTMLParagraphElement]"
+
+String($('#foo', $('#bar')))
+"null"
+
+String($$('p'))
+"[object HTMLParagraphElement],[object HTMLParagraphElement]"
+
+String($$('p', document.body))
+"[object HTMLParagraphElement],[object HTMLParagraphElement]"
+
+String($('foo'))
+"null"
+
+console.assert(keys(window).indexOf('__commandLineAPI') === -1)
+undefined
+
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/devtools-js/console/command-line-api.js b/third_party/WebKit/LayoutTests/http/tests/inspector/devtools-js/console/command-line-api.js
new file mode 100644
index 0000000..6c42016
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector/devtools-js/console/command-line-api.js
@@ -0,0 +1,57 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+(async function() {
+  TestRunner.addResult('Tests that command line api works.\n');
+
+  await TestRunner.loadModule('console_test_runner');
+  await TestRunner.loadModule('elements_test_runner');
+  await TestRunner.loadPanel('console');
+  await TestRunner.loadHTML(`
+    <p id='foo'>
+      Tests that command line api works.
+    </p><p id='bar'></p>
+  `);
+
+  var expressions = [
+    'String($0)',
+    '$3',
+    'String(keys([3,4]))',
+    'String(values([3,4]))',
+    `String($('#foo'))`,
+    `String($('#foo', document.body))`,
+    `String($('#foo', 'non-node'))`,
+    `String($('#foo', $('#bar')))`,
+    `String($$('p'))`,
+    `String($$('p', document.body))`,
+    `String($('foo'))`,
+    `console.assert(keys(window).indexOf('__commandLineAPI') === -1)`
+  ];
+
+  ElementsTestRunner.selectNodeWithId('foo', step1);
+
+  function step1(node) {
+    var expression = expressions.shift();
+    if (!expression) {
+      step2();
+      return;
+    }
+    Common.console.log('');
+    ConsoleTestRunner.evaluateInConsole(expression, step1);
+  }
+
+  function step2() {
+    function assertNoBoundCommandLineAPI() {
+      ['__commandLineAPI', '__scopeChainForEval'].forEach(function(name) {
+        console.assert(!(name in window), 'FAIL: Should be no ' + name);
+      });
+    }
+    TestRunner.evaluateInPage(assertNoBoundCommandLineAPI, step3);
+  }
+
+  function step3() {
+    ConsoleTestRunner.dumpConsoleMessages();
+    TestRunner.completeTest();
+  }
+})();
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/devtools-js/console-clear-expected.txt b/third_party/WebKit/LayoutTests/http/tests/inspector/devtools-js/console/console-clear-expected.txt
similarity index 100%
rename from third_party/WebKit/LayoutTests/http/tests/inspector/devtools-js/console-clear-expected.txt
rename to third_party/WebKit/LayoutTests/http/tests/inspector/devtools-js/console/console-clear-expected.txt
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/devtools-js/console-clear.js b/third_party/WebKit/LayoutTests/http/tests/inspector/devtools-js/console/console-clear.js
similarity index 100%
rename from third_party/WebKit/LayoutTests/http/tests/inspector/devtools-js/console-clear.js
rename to third_party/WebKit/LayoutTests/http/tests/inspector/devtools-js/console/console-clear.js
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot-input-value-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot-input-value-expected.txt
new file mode 100644
index 0000000..2db19523
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot-input-value-expected.txt
@@ -0,0 +1,439 @@
+Tests DOMSnapshot.getSnapshot method returning input values.
+{
+  "domNodes": [
+    {
+      "nodeType": 9,
+      "nodeName": "#document",
+      "nodeValue": "",
+      "backendNodeId": "<number>",
+      "childNodeIndexes": [
+        1
+      ],
+      "layoutNodeIndex": 0,
+      "documentURL": "<string>",
+      "baseURL": "<string>"
+    },
+    {
+      "nodeType": 1,
+      "nodeName": "HTML",
+      "nodeValue": "",
+      "backendNodeId": "<number>",
+      "childNodeIndexes": [
+        2,
+        3
+      ],
+      "layoutNodeIndex": 1,
+      "frameId": "<string>"
+    },
+    {
+      "nodeType": 1,
+      "nodeName": "HEAD",
+      "nodeValue": "",
+      "backendNodeId": "<number>"
+    },
+    {
+      "nodeType": 1,
+      "nodeName": "BODY",
+      "nodeValue": "",
+      "backendNodeId": "<number>",
+      "childNodeIndexes": [
+        4,
+        5,
+        32
+      ],
+      "attributes": [
+        {
+          "name": "class",
+          "value": "body-class"
+        }
+      ],
+      "layoutNodeIndex": 2
+    },
+    {
+      "nodeType": 3,
+      "nodeName": "#text",
+      "nodeValue": "\n",
+      "backendNodeId": "<number>"
+    },
+    {
+      "nodeType": 1,
+      "nodeName": "DIV",
+      "nodeValue": "",
+      "backendNodeId": "<number>",
+      "childNodeIndexes": [
+        6,
+        7,
+        12,
+        13,
+        16,
+        17,
+        19,
+        20,
+        21,
+        22,
+        23,
+        24,
+        25,
+        26,
+        27,
+        28,
+        31
+      ],
+      "attributes": [
+        {
+          "name": "style",
+          "value": "width: 200px"
+        }
+      ],
+      "layoutNodeIndex": 3
+    },
+    {
+      "nodeType": 3,
+      "nodeName": "#text",
+      "nodeValue": "\n  ",
+      "backendNodeId": "<number>"
+    },
+    {
+      "nodeType": 1,
+      "nodeName": "SELECT",
+      "nodeValue": "",
+      "backendNodeId": "<number>",
+      "childNodeIndexes": [
+        8,
+        10
+      ],
+      "layoutNodeIndex": 4
+    },
+    {
+      "nodeType": 1,
+      "nodeName": "OPTION",
+      "nodeValue": "",
+      "optionSelected": true,
+      "backendNodeId": "<number>",
+      "childNodeIndexes": [
+        9
+      ],
+      "attributes": [
+        {
+          "name": "id",
+          "value": "OptionSelected"
+        }
+      ]
+    },
+    {
+      "nodeType": 3,
+      "nodeName": "#text",
+      "nodeValue": "Option 1",
+      "backendNodeId": "<number>"
+    },
+    {
+      "nodeType": 1,
+      "nodeName": "OPTION",
+      "nodeValue": "",
+      "optionSelected": false,
+      "backendNodeId": "<number>",
+      "childNodeIndexes": [
+        11
+      ],
+      "attributes": [
+        {
+          "name": "id",
+          "value": "OptionNotSelected"
+        }
+      ]
+    },
+    {
+      "nodeType": 3,
+      "nodeName": "#text",
+      "nodeValue": "Option 2",
+      "backendNodeId": "<number>"
+    },
+    {
+      "nodeType": 3,
+      "nodeName": "#text",
+      "nodeValue": "\n  ",
+      "backendNodeId": "<number>",
+      "layoutNodeIndex": 5
+    },
+    {
+      "nodeType": 1,
+      "nodeName": "INPUT",
+      "nodeValue": "",
+      "inputValue": "InputValue",
+      "backendNodeId": "<number>",
+      "childNodeIndexes": [
+        14
+      ],
+      "attributes": [
+        {
+          "name": "id",
+          "value": "TextInput"
+        },
+        {
+          "name": "value",
+          "value": "InputValue"
+        }
+      ],
+      "layoutNodeIndex": 6,
+      "isClickable": true
+    },
+    {
+      "nodeType": 1,
+      "nodeName": "DIV",
+      "nodeValue": "",
+      "backendNodeId": "<number>",
+      "childNodeIndexes": [
+        15
+      ],
+      "attributes": [
+        {
+          "name": "id",
+          "value": "inner-editor"
+        }
+      ],
+      "layoutNodeIndex": 7,
+      "isClickable": true
+    },
+    {
+      "nodeType": 3,
+      "nodeName": "#text",
+      "nodeValue": "InputValue",
+      "backendNodeId": "<number>",
+      "layoutNodeIndex": 8,
+      "isClickable": true
+    },
+    {
+      "nodeType": 3,
+      "nodeName": "#text",
+      "nodeValue": "\n  ",
+      "backendNodeId": "<number>",
+      "layoutNodeIndex": 9
+    },
+    {
+      "nodeType": 1,
+      "nodeName": "INPUT",
+      "nodeValue": "",
+      "inputValue": "ButtonValue",
+      "backendNodeId": "<number>",
+      "childNodeIndexes": [
+        18
+      ],
+      "attributes": [
+        {
+          "name": "id",
+          "value": "ButtonInput"
+        },
+        {
+          "name": "type",
+          "value": "button"
+        },
+        {
+          "name": "value",
+          "value": "ButtonValue"
+        }
+      ],
+      "layoutNodeIndex": 10,
+      "isClickable": true
+    },
+    {
+      "nodeType": 3,
+      "nodeName": "#text",
+      "nodeValue": "ButtonValue",
+      "backendNodeId": "<number>",
+      "layoutNodeIndex": 11
+    },
+    {
+      "nodeType": 3,
+      "nodeName": "#text",
+      "nodeValue": "\n  ",
+      "backendNodeId": "<number>",
+      "layoutNodeIndex": 12
+    },
+    {
+      "nodeType": 1,
+      "nodeName": "INPUT",
+      "nodeValue": "",
+      "inputValue": "RadioInputValue",
+      "inputChecked": true,
+      "backendNodeId": "<number>",
+      "attributes": [
+        {
+          "name": "id",
+          "value": "RadioInputChecked"
+        },
+        {
+          "name": "value",
+          "value": "RadioInputValue"
+        },
+        {
+          "name": "type",
+          "value": "radio"
+        },
+        {
+          "name": "checked",
+          "value": ""
+        }
+      ],
+      "layoutNodeIndex": 13,
+      "isClickable": true
+    },
+    {
+      "nodeType": 3,
+      "nodeName": "#text",
+      "nodeValue": "\n  ",
+      "backendNodeId": "<number>",
+      "layoutNodeIndex": 14
+    },
+    {
+      "nodeType": 1,
+      "nodeName": "INPUT",
+      "nodeValue": "",
+      "inputValue": "on",
+      "inputChecked": false,
+      "backendNodeId": "<number>",
+      "attributes": [
+        {
+          "name": "id",
+          "value": "RadioInputUnchecked"
+        },
+        {
+          "name": "type",
+          "value": "radio"
+        }
+      ],
+      "layoutNodeIndex": 15,
+      "isClickable": true
+    },
+    {
+      "nodeType": 3,
+      "nodeName": "#text",
+      "nodeValue": "\n  ",
+      "backendNodeId": "<number>",
+      "layoutNodeIndex": 16
+    },
+    {
+      "nodeType": 1,
+      "nodeName": "INPUT",
+      "nodeValue": "",
+      "inputValue": "CheckInputValue",
+      "inputChecked": true,
+      "backendNodeId": "<number>",
+      "attributes": [
+        {
+          "name": "id",
+          "value": "CheckboxInputChecked"
+        },
+        {
+          "name": "value",
+          "value": "CheckInputValue"
+        },
+        {
+          "name": "type",
+          "value": "checkbox"
+        },
+        {
+          "name": "checked",
+          "value": ""
+        }
+      ],
+      "layoutNodeIndex": 17,
+      "isClickable": true
+    },
+    {
+      "nodeType": 3,
+      "nodeName": "#text",
+      "nodeValue": "\n  ",
+      "backendNodeId": "<number>",
+      "layoutNodeIndex": 18
+    },
+    {
+      "nodeType": 1,
+      "nodeName": "INPUT",
+      "nodeValue": "",
+      "inputValue": "",
+      "inputChecked": false,
+      "backendNodeId": "<number>",
+      "attributes": [
+        {
+          "name": "id",
+          "value": "CheckboxInputUnchecked"
+        },
+        {
+          "name": "type",
+          "value": "checkbox"
+        },
+        {
+          "name": "value",
+          "value": ""
+        }
+      ],
+      "layoutNodeIndex": 19,
+      "isClickable": true
+    },
+    {
+      "nodeType": 3,
+      "nodeName": "#text",
+      "nodeValue": "\n  ",
+      "backendNodeId": "<number>",
+      "layoutNodeIndex": 20
+    },
+    {
+      "nodeType": 1,
+      "nodeName": "TEXTAREA",
+      "nodeValue": "",
+      "textValue": "TextAreaValue",
+      "backendNodeId": "<number>",
+      "childNodeIndexes": [
+        29
+      ],
+      "attributes": [
+        {
+          "name": "id",
+          "value": "TextArea"
+        }
+      ],
+      "layoutNodeIndex": 21
+    },
+    {
+      "nodeType": 1,
+      "nodeName": "DIV",
+      "nodeValue": "",
+      "backendNodeId": "<number>",
+      "childNodeIndexes": [
+        30
+      ],
+      "attributes": [
+        {
+          "name": "id",
+          "value": "inner-editor"
+        }
+      ],
+      "layoutNodeIndex": 22,
+      "isClickable": true
+    },
+    {
+      "nodeType": 3,
+      "nodeName": "#text",
+      "nodeValue": "TextAreaValue",
+      "backendNodeId": "<number>",
+      "layoutNodeIndex": 23,
+      "isClickable": true
+    },
+    {
+      "nodeType": 3,
+      "nodeName": "#text",
+      "nodeValue": "\n",
+      "backendNodeId": "<number>",
+      "layoutNodeIndex": 24
+    },
+    {
+      "nodeType": 3,
+      "nodeName": "#text",
+      "nodeValue": "\n\n\n",
+      "backendNodeId": "<number>"
+    }
+  ],
+  "layoutTreeNodes": "<object>",
+  "computedStyles": "<object>"
+}
+
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot-input-value.js b/third_party/WebKit/LayoutTests/inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot-input-value.js
new file mode 100644
index 0000000..da59d71ca
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot-input-value.js
@@ -0,0 +1,19 @@
+(async function(testRunner) {
+  let {page, session, dp} = await testRunner.startURL('../resources/dom-snapshot-input-value.html', 'Tests DOMSnapshot.getSnapshot method returning input values.');
+
+  function stabilize(key, value) {
+    var unstableKeys = ['documentURL', 'baseURL', 'frameId', 'backendNodeId', 'layoutTreeNodes', 'computedStyles'];
+    if (unstableKeys.indexOf(key) !== -1)
+      return '<' + typeof(value) + '>';
+    if (typeof value === 'string' && value.indexOf('/dom-snapshot/') !== -1)
+      value = '<value>';
+    return value;
+  }
+
+  var response = await dp.DOMSnapshot.getSnapshot({'computedStyleWhitelist': []});
+  if (response.error)
+    testRunner.log(response);
+  else
+    testRunner.log(JSON.stringify(response.result, stabilize, 2));
+  testRunner.completeTest();
+})
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/resources/dom-snapshot-input-value.html b/third_party/WebKit/LayoutTests/inspector-protocol/resources/dom-snapshot-input-value.html
new file mode 100644
index 0000000..3ac7f1a
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/resources/dom-snapshot-input-value.html
@@ -0,0 +1,17 @@
+<html>
+<body class="body-class">
+<div style="width: 200px">
+  <select>
+    <option id='OptionSelected'>Option 1</option>
+    <option id='OptionNotSelected'>Option 2</option>
+  </select>
+  <input id='TextInput' value='InputValue'>
+  <input id='ButtonInput' type='button' value='ButtonValue'>
+  <input id='RadioInputChecked' value='RadioInputValue' type='radio' checked>
+  <input id='RadioInputUnchecked' type='radio'>
+  <input id='CheckboxInputChecked' value='CheckInputValue' type='checkbox' value='' checked>
+  <input id='CheckboxInputUnchecked' type='checkbox' value=''>
+  <textarea id='TextArea'>TextAreaValue</textarea>
+</div>
+</body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/inspector/profiler/heap-snapshot-summary-expand-collapse-expected.txt b/third_party/WebKit/LayoutTests/inspector/profiler/heap-snapshot-summary-expand-collapse-expected.txt
index 4b9a904..ffdb1a3 100644
--- a/third_party/WebKit/LayoutTests/inspector/profiler/heap-snapshot-summary-expand-collapse-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector/profiler/heap-snapshot-summary-expand-collapse-expected.txt
@@ -4,17 +4,6 @@
 Detailed heap profiles were enabled.
 
 Running: testShowAll
-A data-grid-data-grid-node parent revealed
-A data-grid-data-grid-node parent revealed
-A data-grid-data-grid-node parent revealed
-A data-grid-data-grid-node parent revealed
-A data-grid-data-grid-node parent revealed
-A data-grid-data-grid-node parent revealed
-A data-grid-data-grid-node parent revealed
-A data-grid-data-grid-node parent revealed
-A data-grid-data-grid-node parent revealed
-A data-grid-data-grid-node parent revealed
-undefined data-grid-data-grid-node revealed
 
 Profiler was disabled.
 
diff --git a/third_party/WebKit/LayoutTests/inspector/profiler/heap-snapshot-summary-expand-collapse.html b/third_party/WebKit/LayoutTests/inspector/profiler/heap-snapshot-summary-expand-collapse.html
index 42c16aa..db58afd 100644
--- a/third_party/WebKit/LayoutTests/inspector/profiler/heap-snapshot-summary-expand-collapse.html
+++ b/third_party/WebKit/LayoutTests/inspector/profiler/heap-snapshot-summary-expand-collapse.html
@@ -31,8 +31,8 @@
             {
                 row.collapse();
                 row.expand();
-                for (var child of row.children)
-                    InspectorTest.addResult(child._name + " " + child._element.classList.value);
+                var visibleChildren = row.children.filter(c => c._element.classList.contains('revealed'));
+                InspectorTest.assertEquals(11, visibleChildren.length);
                 next();
             }
         }
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/selection/drag-select-1-expected.png b/third_party/WebKit/LayoutTests/platform/linux/editing/selection/drag-select-1-expected.png
index e7e6a53165..f11b0e2 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/selection/drag-select-1-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/editing/selection/drag-select-1-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/validation-bubble-appearance-edge-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/validation-bubble-appearance-edge-expected.png
new file mode 100644
index 0000000..dde94f56
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/validation-bubble-appearance-edge-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/validation-bubble-appearance-iframe-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/validation-bubble-appearance-iframe-expected.png
new file mode 100644
index 0000000..da07c14f
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/validation-bubble-appearance-iframe-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/validation-bubble-appearance-rtl-ui-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/validation-bubble-appearance-rtl-ui-expected.png
new file mode 100644
index 0000000..f28e86ae2
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/validation-bubble-appearance-rtl-ui-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/text/ellipsis-in-relative-inline-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/text/ellipsis-in-relative-inline-expected.png
new file mode 100644
index 0000000..8c1f121
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/text/ellipsis-in-relative-inline-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/text/ellipsis-in-relative-inline-right-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/text/ellipsis-in-relative-inline-right-expected.png
new file mode 100644
index 0000000..7cef40b4d
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/text/ellipsis-in-relative-inline-right-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/scalefactor150/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/scalefactor150/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png
new file mode 100644
index 0000000..f0356042
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/scalefactor150/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/scalefactor200/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/scalefactor200/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png
new file mode 100644
index 0000000..cb80dff
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/scalefactor200/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/scalefactor200withzoom/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/scalefactor200withzoom/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png
new file mode 100644
index 0000000..cb80dff
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/scalefactor200withzoom/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/validation-bubble-appearance-edge-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/validation-bubble-appearance-edge-expected.png
new file mode 100644
index 0000000..e922983
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/validation-bubble-appearance-edge-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/validation-bubble-appearance-iframe-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/validation-bubble-appearance-iframe-expected.png
new file mode 100644
index 0000000..3400a2c9
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/validation-bubble-appearance-iframe-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/validation-bubble-appearance-rtl-ui-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/validation-bubble-appearance-rtl-ui-expected.png
new file mode 100644
index 0000000..b9103274
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/validation-bubble-appearance-rtl-ui-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/text/ellipsis-in-relative-inline-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/text/ellipsis-in-relative-inline-expected.png
new file mode 100644
index 0000000..8b4c811d90
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/text/ellipsis-in-relative-inline-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/text/ellipsis-in-relative-inline-right-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/text/ellipsis-in-relative-inline-right-expected.png
new file mode 100644
index 0000000..7e35f98
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/text/ellipsis-in-relative-inline-right-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/scalefactor150/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/scalefactor150/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png
new file mode 100644
index 0000000..b1797c3
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/scalefactor150/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/scalefactor200/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/scalefactor200/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png
new file mode 100644
index 0000000..553b415
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/scalefactor200/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/scalefactor200withzoom/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/scalefactor200withzoom/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png
new file mode 100644
index 0000000..4d8f4d9
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/scalefactor200withzoom/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.11/fast/forms/validation-bubble-appearance-edge-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/fast/forms/validation-bubble-appearance-edge-expected.png
new file mode 100644
index 0000000..7f7d18e
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/fast/forms/validation-bubble-appearance-edge-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.11/fast/forms/validation-bubble-appearance-iframe-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/fast/forms/validation-bubble-appearance-iframe-expected.png
new file mode 100644
index 0000000..e06dd33e
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/fast/forms/validation-bubble-appearance-iframe-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.11/fast/forms/validation-bubble-appearance-rtl-ui-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/fast/forms/validation-bubble-appearance-rtl-ui-expected.png
new file mode 100644
index 0000000..7641783
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/fast/forms/validation-bubble-appearance-rtl-ui-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.11/virtual/scalefactor150/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/virtual/scalefactor150/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png
new file mode 100644
index 0000000..a34a245
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/virtual/scalefactor150/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.11/virtual/scalefactor200/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/virtual/scalefactor200/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png
new file mode 100644
index 0000000..d76755e6e
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/virtual/scalefactor200/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.11/virtual/scalefactor200withzoom/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/virtual/scalefactor200withzoom/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png
new file mode 100644
index 0000000..818104f8
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/virtual/scalefactor200withzoom/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/validation-bubble-appearance-edge-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/validation-bubble-appearance-edge-expected.png
new file mode 100644
index 0000000..ad4e07bb
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/validation-bubble-appearance-edge-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/validation-bubble-appearance-iframe-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/validation-bubble-appearance-iframe-expected.png
new file mode 100644
index 0000000..965a516
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/validation-bubble-appearance-iframe-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/validation-bubble-appearance-rtl-ui-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/validation-bubble-appearance-rtl-ui-expected.png
new file mode 100644
index 0000000..4bb93e4
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/validation-bubble-appearance-rtl-ui-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/ellipsis-in-relative-inline-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/ellipsis-in-relative-inline-expected.png
new file mode 100644
index 0000000..356c384
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/ellipsis-in-relative-inline-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/ellipsis-in-relative-inline-right-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/ellipsis-in-relative-inline-right-expected.png
new file mode 100644
index 0000000..bc20d2c
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/ellipsis-in-relative-inline-right-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/scalefactor150/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/scalefactor150/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png
new file mode 100644
index 0000000..9223885
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/scalefactor150/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/scalefactor200/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/scalefactor200/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png
new file mode 100644
index 0000000..c0344e6d
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/scalefactor200/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/scalefactor200withzoom/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/scalefactor200withzoom/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png
new file mode 100644
index 0000000..02ad923
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/scalefactor200withzoom/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-retina/fast/forms/validation-bubble-appearance-edge-expected.png b/third_party/WebKit/LayoutTests/platform/mac-retina/fast/forms/validation-bubble-appearance-edge-expected.png
new file mode 100644
index 0000000..7f7d18e
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-retina/fast/forms/validation-bubble-appearance-edge-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-retina/fast/forms/validation-bubble-appearance-iframe-expected.png b/third_party/WebKit/LayoutTests/platform/mac-retina/fast/forms/validation-bubble-appearance-iframe-expected.png
new file mode 100644
index 0000000..e06dd33e
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-retina/fast/forms/validation-bubble-appearance-iframe-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-retina/fast/forms/validation-bubble-appearance-rtl-ui-expected.png b/third_party/WebKit/LayoutTests/platform/mac-retina/fast/forms/validation-bubble-appearance-rtl-ui-expected.png
new file mode 100644
index 0000000..7641783
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-retina/fast/forms/validation-bubble-appearance-rtl-ui-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-retina/virtual/scalefactor150/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png b/third_party/WebKit/LayoutTests/platform/mac-retina/virtual/scalefactor150/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png
new file mode 100644
index 0000000..8f1bb8c7
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-retina/virtual/scalefactor150/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-retina/virtual/scalefactor200/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png b/third_party/WebKit/LayoutTests/platform/mac-retina/virtual/scalefactor200/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png
new file mode 100644
index 0000000..d174aacf
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-retina/virtual/scalefactor200/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-retina/virtual/scalefactor200withzoom/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png b/third_party/WebKit/LayoutTests/platform/mac-retina/virtual/scalefactor200withzoom/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png
new file mode 100644
index 0000000..818104f8
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac-retina/virtual/scalefactor200withzoom/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/text/ellipsis-in-relative-inline-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/text/ellipsis-in-relative-inline-expected.png
new file mode 100644
index 0000000..30aa4d37
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/text/ellipsis-in-relative-inline-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/text/ellipsis-in-relative-inline-right-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/text/ellipsis-in-relative-inline-right-expected.png
new file mode 100644
index 0000000..284a0c0b
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/text/ellipsis-in-relative-inline-right-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/scalefactor200/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/scalefactor200/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png
similarity index 100%
rename from third_party/WebKit/LayoutTests/virtual/scalefactor200/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png
rename to third_party/WebKit/LayoutTests/platform/mac/virtual/scalefactor200/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/selection/drag-select-1-expected.png b/third_party/WebKit/LayoutTests/platform/win/editing/selection/drag-select-1-expected.png
index 42b1a8bd..4c8a96c 100644
--- a/third_party/WebKit/LayoutTests/platform/win/editing/selection/drag-select-1-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/editing/selection/drag-select-1-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/forms/validation-bubble-appearance-edge-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/forms/validation-bubble-appearance-edge-expected.png
new file mode 100644
index 0000000..f3c6966
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win/fast/forms/validation-bubble-appearance-edge-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/forms/validation-bubble-appearance-iframe-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/forms/validation-bubble-appearance-iframe-expected.png
new file mode 100644
index 0000000..86f19c90
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win/fast/forms/validation-bubble-appearance-iframe-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/forms/validation-bubble-appearance-rtl-ui-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/forms/validation-bubble-appearance-rtl-ui-expected.png
new file mode 100644
index 0000000..a59a36b
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win/fast/forms/validation-bubble-appearance-rtl-ui-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/text/ellipsis-in-relative-inline-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/text/ellipsis-in-relative-inline-expected.png
new file mode 100644
index 0000000..57827c1
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win/fast/text/ellipsis-in-relative-inline-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/text/ellipsis-in-relative-inline-right-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/text/ellipsis-in-relative-inline-right-expected.png
new file mode 100644
index 0000000..9a460f06
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win/fast/text/ellipsis-in-relative-inline-right-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/scalefactor150/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/scalefactor150/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png
new file mode 100644
index 0000000..15ef195
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/scalefactor150/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/scalefactor200/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/scalefactor200/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png
new file mode 100644
index 0000000..3bdefb2
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/scalefactor200/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/scalefactor200withzoom/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/scalefactor200withzoom/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png
new file mode 100644
index 0000000..3bdefb2
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/scalefactor200withzoom/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win7/fast/text/ellipsis-in-relative-inline-expected.png b/third_party/WebKit/LayoutTests/platform/win7/fast/text/ellipsis-in-relative-inline-expected.png
new file mode 100644
index 0000000..0f65a79a
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win7/fast/text/ellipsis-in-relative-inline-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win7/fast/text/ellipsis-in-relative-inline-right-expected.png b/third_party/WebKit/LayoutTests/platform/win7/fast/text/ellipsis-in-relative-inline-right-expected.png
new file mode 100644
index 0000000..4219709b
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win7/fast/text/ellipsis-in-relative-inline-right-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/scalefactor150/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png b/third_party/WebKit/LayoutTests/virtual/scalefactor150/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png
deleted file mode 100644
index 1bc51696..0000000
--- a/third_party/WebKit/LayoutTests/virtual/scalefactor150/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/scalefactor200withzoom/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png b/third_party/WebKit/LayoutTests/virtual/scalefactor200withzoom/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png
deleted file mode 100644
index 715cbe80..0000000
--- a/third_party/WebKit/LayoutTests/virtual/scalefactor200withzoom/fast/hidpi/static/validation-bubble-appearance-hidpi-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/PerformanceTests/OWPStorage/README.md b/third_party/WebKit/PerformanceTests/OWPStorage/README.md
new file mode 100644
index 0000000..fffd908
--- /dev/null
+++ b/third_party/WebKit/PerformanceTests/OWPStorage/README.md
@@ -0,0 +1,7 @@
+# Benchmarks for Open Web Platform Storage.
+
+These benchmarks exercise storage apis in a real-life usage way (avoiding microbenchmarks).
+
+# IDB Docs Load
+
+This models an offline load of a Google doc. See [this document](https://docs.google.com/document/d/1JC1RgMyxBAjUPSHjm2Bd1KPzcqpPPvxRomKevOkMPm0/edit) for a breakdown of the database and the transactions, along with the traces used to extract this information.
\ No newline at end of file
diff --git a/third_party/WebKit/PerformanceTests/OWPStorage/idb-load-docs.html b/third_party/WebKit/PerformanceTests/OWPStorage/idb-load-docs.html
new file mode 100644
index 0000000..1f3f165
--- /dev/null
+++ b/third_party/WebKit/PerformanceTests/OWPStorage/idb-load-docs.html
@@ -0,0 +1,19 @@
+<!doctype html>
+<title>IDB Offline Google Docs Load</title>
+<script src="../resources/runner.js"></script>
+<script src="resources/shared.js"></script>
+<script src="resources/idb-load-docs-shared.js"></script>
+<script src="resources/idb-load-docs-setup.js"></script>
+<script>
+  deleteThenOpen(databaseName, populateFakeDocsDatabase, () => {
+    var test = {
+      description: 'Benchmark modeling the IndexedDB activity of a Google Docs offline page load.',
+      unit: 'ms',
+      iterationCount: 20,
+      tracingCategories: 'IndexedDB',
+      traceEventsToMeasure: ['IndexedDBTransaction::lifetime', 'IDBObjectStore::delete', 'IDBObjectStore::get', 'IDBObjectStore::put', 'IDBObjectStore::openCursor', 'IDBFactory::open'],
+      path: "resources/idb-load-docs-runner.html"
+    }
+    PerfTestRunner.measurePageLoadTimeAfterDoneMessage(test);
+  });
+</script>
diff --git a/third_party/WebKit/PerformanceTests/OWPStorage/resources/idb-load-docs-runner.html b/third_party/WebKit/PerformanceTests/OWPStorage/resources/idb-load-docs-runner.html
new file mode 100644
index 0000000..b3213e6
--- /dev/null
+++ b/third_party/WebKit/PerformanceTests/OWPStorage/resources/idb-load-docs-runner.html
@@ -0,0 +1,191 @@
+<!doctype html>
+<title>IDB Offline Google Docs Load Runner</title>
+<div id="content"></div>
+<script src="resources/shared.js"></script>
+<script src="resources/idb-load-docs-shared.js"></script>
+<script>
+  let openRequest = window.indexedDB.open(databaseName);
+  openRequest.onsuccess = async () => {
+    let db = openRequest.result;
+
+    // https://docs.google.com/document/d/1JC1RgMyxBAjUPSHjm2Bd1KPzcqpPPvxRomKevOkMPm0/edit
+    // contiains information about each transaction and their ordering.
+    let txn1 = () => {
+      let txn = db.transaction("Users", "readonly");
+      txn.onabort = reportError;
+      let users = txn.objectStore("Users");
+
+      let get = users.get("ufa1a865c6eb48d97");
+      get.onsuccess = () => {
+        logToDocumentBody(["Txn1 got user ", get.result.emailAddress]);
+      }
+      return transactionCompletePromise(txn).then(() => {
+        logToDocumentBody("Txn1 done");
+      });
+    };
+
+    let txn2 = () => {
+      let txn = db.transaction(["DocumentLocks"], "readwrite");
+      txn.onabort = reportError;
+      let locks = txn.objectStore("DocumentLocks");
+
+      let get = locks.get([docId1]);
+      get.onsuccess = () => {
+        logToDocumentBody(["Txn2 got lock", get.result.e]);
+      }
+      t2_DocumentLocksValues.forEach((value) => (locks.put(value)));
+      return transactionCompletePromise(txn).then(() => {
+        logToDocumentBody("Txn2 done.");
+      });
+    };
+
+    let txn3 = () => {
+      let txn = db.transaction(["Documents"], "readonly");
+      txn.onabort = reportError;
+      let documents = txn.objectStore("Documents");
+
+      let get = documents.get(docId1);
+      get.onsuccess = () => {
+        var div = logToDocumentBody(
+            "Txn3 done, got the document, with image: ");
+        let img = document.createElement("img");
+        div.appendChild(img);
+        img.src = get.result.docosKeyData[8][2];
+      }
+      return transactionCompletePromise(txn).then(() => {
+        logToDocumentBody("Txn3 done.");
+      });
+    };
+
+    let txn4 = () => {
+      let txn = db.transaction(["PendingQueues"], "readonly");
+      txn.onabort = reportError;
+      let queues = txn.objectStore("PendingQueues");
+
+      let get = queues.get(docId1);
+      get.onsuccess = () => {
+        logToDocumentBody(["Txn4 got queue: ", get.result.r]);
+      }
+      return transactionCompletePromise(txn).then(() => {
+        logToDocumentBody("Txn4 done.");
+      });
+    };
+
+    let txn5 = () => {
+      let txn = db.transaction(["SyncObjects"], "readwrite");
+      txn.onabort = reportError;
+      let syncs = txn.objectStore("SyncObjects");
+
+      t5_SyncObjectsValues.forEach((value) => { syncs.put(value); });
+
+      return transactionCompletePromise(txn).then(() => {
+        logToDocumentBody(
+          ["Txn5 done, set ", t5_SyncObjectsValues.length, " values."]);
+      });
+    };
+
+    let txn6_15 = () => {
+      let promises = [];
+      for (let i = 0; i < 9; ++i) {
+        let txn = db.transaction("FontMetadata", "readonly");
+        txn.onabort = reportError;
+        let get = txn.objectStore("FontMetadata").get("Cambria"); 
+        let name = "Txn " + (i + 6);
+        get.onsuccess = () => {
+          logToDocumentBody([name, " got font with ",
+                             get.result.fontFaces.length, " faces."]);
+        }
+        promises.push(transactionCompletePromise(txn).then(() => {
+          logToDocumentBody([name, " done."]);
+        }));
+      }
+      return Promise.all(promises);
+    };
+
+    let txn16 = () => {
+      let txn = db.transaction("BlobMetadata", "readonly");
+      txn.onabort = reportError;
+      let request = txn.objectStore("BlobMetadata")
+          .openCursor(IDBKeyRange.only("test"));
+      request.onsuccess = function(event) {
+        logToDocumentBody("Checked blob metadata.");
+      }
+      return transactionCompletePromise(txn).then(() => {
+        logToDocumentBody("Txn16 done.");
+      });
+    };
+
+    let txn17 = (docGetCallback) => {
+      let txn = db.transaction(["DocumentLocks", "Documents", "PendingQueues",
+                                "BlobMetadata", "DocumentCommands"],
+                               "readwrite");
+      txn.onabort = reportError;
+      let locks = txn.objectStore("DocumentLocks");
+      let documents = txn.objectStore("Documents");
+      let documentCommands = txn.objectStore("DocumentCommands");
+
+      let queues = txn.objectStore("PendingQueues");
+
+      let lockGet;
+      let documentGet;
+      let commandsDelete;
+      let queuesGet;
+      let gets_done = () => {
+        logToDocumentBody(["Starting edit, got lock: ", lockGet.result.e]);
+
+        let div = logToDocumentBody("Document with picture: ");
+        let img = document.createElement("img");
+        div.appendChild(img);
+        img.src = documentGet.result.docosKeyData[8][2];
+
+        logToDocumentBody(["And the queue: ", queuesGet.result.r]);
+
+        locks.put(t17_DocumentLocksValue);
+        documents.put(t17_DocumentsValue);
+        documentCommands.put(t17_DocumentCommandsValue);
+        queues.put(t17_PendingQueuesValue);
+      };
+      let incrementBarrier = createIncrementalBarrier(gets_done);
+
+      lockGet = locks.get([docId1]);
+      documentGet = documents.get(docId1);
+      queuesGet = queues.get(docId1);
+      commandsDelete = documentCommands.delete(
+            IDBKeyRange.bound([docId1], [docId1, []], false, false));
+
+      lockGet.onsuccess = incrementBarrier();
+      let docGetBarrier = incrementBarrier();
+      documentGet.onsuccess = () => {
+        docGetCallback();
+        docGetBarrier();
+      };
+      commandsDelete.onsuccess = incrementBarrier();
+      queuesGet.onsuccess = incrementBarrier();
+
+      return transactionCompletePromise(txn).then(() => {
+        logToDocumentBody("Txn17 done.");
+      });
+    };
+
+    let txn18 = () => {
+      let txn = db.transaction(["Documents"], "readonly");
+      txn.onabort = reportError;
+      let documents = txn.objectStore("Documents");
+
+      documents.get(docId1).onsuccess = () => {
+        logToDocumentBody("Got final document!");
+      }
+
+      return transactionCompletePromise(txn).then(() => {
+        logToDocumentBody("Txn18 done");
+      });
+    };
+
+    // https://docs.google.com/document/d/1JC1RgMyxBAjUPSHjm2Bd1KPzcqpPPvxRomKevOkMPm0/edit
+    // has an explanation of transaction order.
+    await txn1();
+    await Promise.all([txn2(), txn3(), txn4()]);
+    await Promise.all([txn5(), txn6_15(), txn16(), txn17(txn18)]);
+    reportDone();
+  };
+</script>
diff --git a/third_party/WebKit/PerformanceTests/OWPStorage/resources/idb-load-docs-setup.js b/third_party/WebKit/PerformanceTests/OWPStorage/resources/idb-load-docs-setup.js
new file mode 100644
index 0000000..f0d9e8f8
--- /dev/null
+++ b/third_party/WebKit/PerformanceTests/OWPStorage/resources/idb-load-docs-setup.js
@@ -0,0 +1,154 @@
+// Our database schema:
+// Users
+// * key - string
+// * value - dictionary w/ strings and an array
+// * 1 entry
+// DocumentLocks
+// * key - array w/ one string item
+// * value - dictionary w/ string, number, and array of string
+// * 469 entries
+// Documents
+// * key - string
+// * value - dictionary, w/ nested dictionaries, strings, numbers, arrays
+//   (one of which has lots of items - numbers, strings, further arrays)
+// * 730 entries
+// PendingQueues
+// * key - string
+// * value - dictionary w/ empty array, strings, numbers, bools, undefineds
+// * 730 entries
+// DocumentCommands
+// * key - array
+// * value - everything! large.
+// * 2000 entries - we only do 20 to make things not too long for startup.
+// PendingQueueCommands
+// * empty
+// SyncObjects
+// * key - array of strings
+// * value - dictionary w/ dictionaries, keypath, and timestamp
+// * 55 entries
+// FontMetadata
+// * key - string of font name
+// * value - dictionary of arrays of dictionaries. strings, numbers, etc
+let populateFakeDocsDatabase = function(db) {
+
+  function randomAlphaNum(length) {
+    const chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-';
+    let result = '';
+    for (let i = length; i > 0; --i)
+      result += chars[Math.floor(Math.random() * chars.length)];
+    return result;
+  }
+
+  let otherDocsIds = [];
+  for (let i = 0; i < 729; i++) {
+    otherDocsIds.push(randomAlphaNum(44));
+  }
+
+  let populateUser = function() {
+    let users = db.createObjectStore("Users", {
+      keyPath: "id"
+    });
+    users.put(UsersValue);
+  }
+
+  let populateDocumentLocks = function() {
+    let documentLocks = db.createObjectStore("DocumentLocks", {
+      keyPath: "dlKey"
+    });
+    documentLocks.put(DocumentLocksValue);
+    DocumentLocksValue.dlKey = [docId2];
+    documentLocks.put(DocumentLocksValue);
+
+    for (let other_doc_id of otherDocsIds) {
+      DocumentLocksValue.id = other_doc_id;
+      documentLocks.put(DocumentLocksValue);
+    }
+  }
+
+  let populateDocuments = function() {
+    // first put our 2 docs, then copy the rest.
+    let documents = db.createObjectStore("Documents", {
+      keyPath: "id"
+    });
+    documents.put(Documents1Value);
+    documents.put(Documents2Value);
+
+    for (let other_doc_id of otherDocsIds) {
+      Documents2Value.id = other_doc_id;
+      documents.put(Documents2Value);
+    }
+  }
+
+  let populateDocumentCommands = function() {
+    let commands = db.createObjectStore("DocumentCommands", {
+      keyPath: "dcKey"
+    });
+    commands.put(t17_DocumentCommandsValue);
+
+    for (let i = 0; i < 50; i++) {
+      t17_DocumentCommandsValue.dcKey[0] = randomAlphaNum(44);
+      commands.put(t17_DocumentCommandsValue);
+    }
+  }
+
+  let populatePendingQueues = function() {
+    // first put our 2 docs, then copy the rest.
+    let queues = db.createObjectStore("PendingQueues", {
+      keyPath: "docId"
+    });
+    queues.put(PendingQueues1Value);
+    queues.put(PendingQueues2Value);
+
+    for (let other_doc_id of otherDocsIds) {
+      PendingQueues2Value.id = other_doc_id;
+      queues.put(PendingQueues2Value);
+    }
+  }
+
+  let createPendingQueueCommands = function() {
+    db.createObjectStore("PendingQueueCommands");
+  }
+
+  let populateSyncObjects = function() {
+    let sync_objects = db.createObjectStore("SyncObjects", {
+      keyPath: "keyPath"
+    });
+    sync_objects.put(SyncObjects1Value);
+    sync_objects.put(SyncObjects2Value);
+    sync_objects.put(SyncObjects3Value);
+    sync_objects.put(SyncObjects4Value);
+    for (let i = 0; i < 51; ++i) {
+      SyncObjects1Value.keyPath[2] = randomAlphaNum(10);
+      sync_objects.put(SyncObjects4Value);
+    }
+  }
+
+  let populateFontMetadata = function() {
+    let fonts = db.createObjectStore("FontMetadata", {
+      keyPath: "fontFamily"
+    });
+    fonts.put(FontMetadata1Value);
+    fonts.put(FontMetadata2Value);
+
+    for (let i = 0; i < 148; ++i) {
+      FontMetadata1Value.fontFamily = randomAlphaNum(10);
+      fonts.put(FontMetadata1Value);
+    }
+  }
+
+  let createBlobMetadata = function() {
+    db.createObjectStore("BlobMetadata", {
+      keyPath: ["d", "p"]
+    });
+  }
+
+  populateUser();
+  populateDocumentLocks();
+  populateDocuments();
+  populateDocumentCommands();
+  populatePendingQueues();
+  createPendingQueueCommands();
+  populateSyncObjects();
+  populateFontMetadata();
+  createBlobMetadata();
+}
diff --git a/third_party/WebKit/PerformanceTests/OWPStorage/resources/idb-load-docs-shared.js b/third_party/WebKit/PerformanceTests/OWPStorage/resources/idb-load-docs-shared.js
new file mode 100644
index 0000000..c373227b
--- /dev/null
+++ b/third_party/WebKit/PerformanceTests/OWPStorage/resources/idb-load-docs-shared.js
@@ -0,0 +1,19838 @@
+var databaseName = "testdb";
+var docId1 = "19OmSKoWTJrUPwoA3G2-ZHe6jPMw2voDpyStgHFXH7qI";
+var docId2 = "1HybJ594lZzyzPzZGCgf1JFwXA5rPx5Z0bO19glO-a5k";
+
+var UsersValue = {
+  "id": "ufa1a865c6eb48d97",
+  "fastTrack": "true",
+  "emailAddress": "fake@email.com",
+  "locale": "en",
+  "internal": "true",
+  "optInReasons": [1]
+}
+
+var DocumentLocksValue = {
+  "e": 1497567754647,
+  "dlKey": [docId1],
+  "sId": "38033a00ec4b057f"
+}
+
+var Documents1Value = {
+  "id": docId1,
+  "documentType": "kix",
+  "hpmdo": "",
+  "relevancyRank": 120,
+  "jobset": "prod",
+  "isFastTrack": "true",
+  "lastSyncedTimestamp": 1497566293056,
+  "lsst": 1497566291952,
+  "title": "Blob Storage Refactor",
+  "ind": "",
+  "lastModifiedServerTimestamp": 1493420139817,
+  "modelVersion": 0,
+  "featureVersion": 0,
+  "inc": "",
+  "acl": {
+    "ufa1a865c6eb48d97": 4
+  },
+  "docosKeyData": [null, null, 0, "", null, "0", [null, 1, null, 1, 1, 1], null, ["Fake Name", null, "//lh5.googleusercontent.com/-7TvIUEovWGE/AAAAAAAAAAI/AAAAAAAABUs/WoZoPBOY_iw/s96-k-no/photo.jpg", "100317903111359348790", 1, null, 0, "fake@email.com"], 1, docId1, null, 1, null, null, null, 0, 1, 1, 1, null, null, null, null, 1, 1, "/comments/u/100317903111359348790/c", 0, null, 1, null, null, 1, null, null, null, 1, 1, 1, 1, 0, null, 0, ["tf", 60000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [[5700016, 5700019, 5700028, 5700032, 5700042, 5700057, 5700058, 5700085, 5700100, 5700103, 5700105, 5700114, 5700127, 5700130, 5700136, 5700146, 5700162, 5700180, 5700187, 5700189, 5700213, 5700248, 5700250, 5700258, 5700266, 5700286, 5700333, 5700350, 5700362, 5700386, 5700394, 5700410, 5700446, 5700470, 5700505, 5700527, 5700547, 5700551, 5700567, 5700588, 5700591, 5700600, 5700611, 5700634, 5700638, 5700650, 5700658, 5700668, 5700672, 5700684, 5700784, 5700788, 5700808, 5700838, 5700892, 5700900, 5700908, 5700933, 5700937, 5700962, 5700978, 5700982, 5701022, 5701054, 5701062, 5701067, 5701075, 5701143, 5701167, 5701176, 5701192, 5701204, 5701224, 5701244, 5701248, 5701264, 5701284, 5701288, 5701302, 5701323, 5701358, 5701373, 5701401, 5701442, 5701540]], 125],
+  "ips": "",
+  "snapshotState": 1,
+  "lastServerSnapshotTimestamp": 1497566292898,
+  "rev": 818,
+  "rai": ["34WZV82YtTmOtA"],
+  "lss": "true",
+  "lsft": 1497566292527,
+  "lastWarmStartedTimestamp": 1497566292882,
+  "pendingQueueState": 1,
+  "startupHints": {
+    "fontFamilies": "[]"
+  }
+}
+
+var Documents2Value = {
+  "id": docId2,
+  "documentType": "kix",
+  "hpmdo": "",
+  "relevancyRank": 121,
+  "jobset": "prod",
+  "isFastTrack": "true",
+  "lastSyncedTimestamp": 1497566108980,
+  "lsst": 1497566107286,
+  "title": "Blob Storage Refactor Plan/Requirements (bit.ly/BlobPlan)",
+  "ind": "",
+  "lastModifiedServerTimestamp": 1457989229859,
+  "modelVersion": 0,
+  "featureVersion": 0,
+  "inc": "",
+  "acl": {
+    "ufa1a865c6eb48d97": 2
+  },
+  "docosKeyData": [null, null, 0, "", null, "0", [null, 1, null, 1, 1, 1], null, ["Fake Name", null, "//lh5.googleusercontent.com/-7TvIUEovWGE/AAAAAAAAAAI/AAAAAAAABUs/WoZoPBOY_iw/s96-k-no/photo.jpg", "100317903111359348790", 1, null, 0, "fake@email.com"], 1, docId2, null, 1, null, null, null, 0, 1, 1, 1, null, null, null, null, 1, 1, "/comments/u/100317903111359348790/c", 0, null, 1, null, null, 1, null, null, null, 1, 1, 1, 1, 0, null, 0, ["tf", 60000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [[5700016, 5700019, 5700028, 5700032, 5700042, 5700057, 5700058, 5700085, 5700100, 5700103, 5700105, 5700114, 5700127, 5700130, 5700136, 5700146, 5700162, 5700180, 5700187, 5700189, 5700213, 5700248, 5700250, 5700258, 5700266, 5700286, 5700333, 5700350, 5700362, 5700386, 5700394, 5700410, 5700446, 5700470, 5700505, 5700527, 5700547, 5700551, 5700567, 5700588, 5700591, 5700600, 5700611, 5700634, 5700638, 5700650, 5700658, 5700668, 5700672, 5700684, 5700784, 5700788, 5700808, 5700838, 5700892, 5700900, 5700908, 5700933, 5700937, 5700962, 5700978, 5700982, 5701022, 5701054, 5701062, 5701067, 5701075, 5701143, 5701167, 5701176, 5701192, 5701204, 5701224, 5701244, 5701248, 5701264, 5701284, 5701288, 5701302, 5701323, 5701358, 5701373, 5701401, 5701442, 5701540]], 125],
+  "startupHints": {
+    "fontFamilies": "[\"Consolas\"]"
+  },
+  "ips": "",
+  "snapshotState": 1,
+  "lastServerSnapshotTimestamp": 1497566108405,
+  "rev": 2142,
+  "rai": ["3WTgfg5N4LGHwA"],
+  "lss": "true",
+  "lsft": 1497566108980,
+  "lastWarmStartedTimestamp": 1497561959618,
+  "pendingQueueState": 1
+}
+
+var PendingQueues1Value = {
+  "docId": docId1,
+  "r": 818,
+  "ra": ["34WZV82YtTmOtA"],
+  "b": [],
+  "t": "kix",
+  "u": false,
+  "uc": false,
+  "a": 4
+}
+
+var PendingQueues2Value = {
+  "docId": docId2,
+  "r": 2142,
+  "ra": ["3WTgfg5N4LGHwA"],
+  "b": [],
+  "t": "kix",
+  "u": false,
+  "uc": false,
+  "a": 2
+}
+
+var SyncObjects1Value = {
+  "keyPath": ["syncMap", "preferences", "docs-show_smart_todo", "1"],
+  "state": {
+    "timestamp": 1476131907463159
+  },
+  "data": {
+    "value": false
+  }
+}
+
+var SyncObjects2Value = {
+  "keyPath": ["syncMap", "preferences", "docs-voice_tips_shown"],
+  "state": {
+    "timestamp": 1456437957716583
+  },
+  "data": {
+    "value": true
+  }
+}
+
+var SyncObjects3Value = {
+  "keyPath": ["syncMap", "domainFonts", "2"],
+  "state": {
+    "hashValue": "00000000"
+  },
+  "data": {
+    "value": []
+  }
+}
+
+var SyncObjects4Value = {
+  "keyPath": ["syncMap", "domainFonts", "5"],
+  "state": {
+    "hashValue": "00000000"
+  },
+  "data": {
+    "value": []
+  }
+}
+
+var FontMetadata1Value = {
+  "fontFamily": "Cambria",
+  "version": "v8",
+  "fontFaces": [{
+    "fontFamily": "Cambria",
+    "subset": "LATIN",
+    "isMenuFont": false,
+    "source": [{
+      "format": "woff2",
+      "isSystemFont": true,
+      "url": "Cambria"
+    }, {
+      "format": "woff2",
+      "isSystemFont": false,
+      "url": "filesystem:https://docs.google.com/persistent/docs/fonts/kTvgLiCA8aQWSqmAzkL5Ig.woff2"
+    }],
+    "style": "normal",
+    "weight": 400
+  }, {
+    "fontFamily": "Cambria",
+    "subset": "LATIN",
+    "isMenuFont": false,
+    "source": [{
+      "format": "woff2",
+      "isSystemFont": true,
+      "url": "Cambria Italic"
+    }, {
+      "format": "woff2",
+      "isSystemFont": true,
+      "url": "Cambria-Italic"
+    }, {
+      "format": "woff2",
+      "isSystemFont": false,
+      "url": "filesystem:https://docs.google.com/persistent/docs/fonts/MD9mg8Cy2AOZQTj1RMSKultXRa8TVwTICgirnJhmVJw.woff2"
+    }],
+    "style": "italic",
+    "weight": 400
+  }, {
+    "fontFamily": "Cambria",
+    "subset": "LATIN",
+    "isMenuFont": false,
+    "source": [{
+      "format": "woff2",
+      "isSystemFont": true,
+      "url": "Cambria Bold"
+    }, {
+      "format": "woff2",
+      "isSystemFont": true,
+      "url": "Cambria-Bold"
+    }, {
+      "format": "woff2",
+      "isSystemFont": false,
+      "url": "filesystem:https://docs.google.com/persistent/docs/fonts/wkshsMjunzKumD3zh1j69fk_vArhqVIZ0nv9q090hN8.woff2"
+    }],
+    "style": "normal",
+    "weight": 700
+  }, {
+    "fontFamily": "Cambria",
+    "subset": "LATIN",
+    "isMenuFont": false,
+    "source": [{
+      "format": "woff2",
+      "isSystemFont": true,
+      "url": "Cambria Bold Italic"
+    }, {
+      "format": "woff2",
+      "isSystemFont": true,
+      "url": "Cambria-BoldItalic"
+    }, {
+      "format": "woff2",
+      "isSystemFont": false,
+      "url": "filesystem:https://docs.google.com/persistent/docs/fonts/v58W6z8cm42h92CJRCAnu-gdm0LZdjqr5-oayXSOefg.woff2"
+    }],
+    "style": "italic",
+    "weight": 700
+  }, {
+    "fontFamily": "Cambria--Menu",
+    "subset": "MENU",
+    "isMenuFont": true,
+    "source": [{
+      "format": "woff2",
+      "isSystemFont": false,
+      "url": "filesystem:https://docs.google.com/persistent/docs/fonts/sbviuG-CrcABsuQ0sUqA2Q.woff2"
+    }],
+    "style": "normal",
+    "weight": 400
+  }]
+}
+
+var FontMetadata2Value = {
+  "fontFamily": "Cambria|*",
+  "version": "v8",
+  "fontFaces": [{
+    "fontFamily": "Cambria",
+    "subset": "*",
+    "isMenuFont": false,
+    "source": [{
+      "format": "woff2",
+      "isSystemFont": true,
+      "url": "Cambria"
+    }, {
+      "format": "woff2",
+      "isSystemFont": false,
+      "url": "filesystem:https://docs.google.com/persistent/docs/fonts/133SsNFRLekIfsI-p7dGDA.woff2"
+    }],
+    "style": "normal",
+    "weight": 400
+  }, {
+    "fontFamily": "Cambria",
+    "subset": "*",
+    "isMenuFont": false,
+    "source": [{
+      "format": "woff2",
+      "isSystemFont": true,
+      "url": "Cambria Italic"
+    }, {
+      "format": "woff2",
+      "isSystemFont": true,
+      "url": "Cambria-Italic"
+    }, {
+      "format": "woff2",
+      "isSystemFont": false,
+      "url": "filesystem:https://docs.google.com/persistent/docs/fonts/QsRvbygpx3GqovnubwJCpA.woff2"
+    }],
+    "style": "italic",
+    "weight": 400
+  }, {
+    "fontFamily": "Cambria",
+    "subset": "*",
+    "isMenuFont": false,
+    "source": [{
+      "format": "woff2",
+      "isSystemFont": true,
+      "url": "Cambria Bold"
+    }, {
+      "format": "woff2",
+      "isSystemFont": true,
+      "url": "Cambria-Bold"
+    }, {
+      "format": "woff2",
+      "isSystemFont": false,
+      "url": "filesystem:https://docs.google.com/persistent/docs/fonts/7z3COyp-8Ysy-M17sN2-OPesZW2xOQ-xsNqO47m55DA.woff2"
+    }],
+    "style": "normal",
+    "weight": 700
+  }, {
+    "fontFamily": "Cambria",
+    "subset": "*",
+    "isMenuFont": false,
+    "source": [{
+      "format": "woff2",
+      "isSystemFont": true,
+      "url": "Cambria Bold Italic"
+    }, {
+      "format": "woff2",
+      "isSystemFont": true,
+      "url": "Cambria-BoldItalic"
+    }, {
+      "format": "woff2",
+      "isSystemFont": false,
+      "url": "filesystem:https://docs.google.com/persistent/docs/fonts/v58W6z8cm42h92CJRCAnu_k_vArhqVIZ0nv9q090hN8.woff2"
+    }],
+    "style": "italic",
+    "weight": 700
+  }, {
+    "fontFamily": "Cambria--Menu",
+    "subset": "menu",
+    "isMenuFont": true,
+    "source": [{
+      "format": "woff2",
+      "isSystemFont": false,
+      "url": "filesystem:https://docs.google.com/persistent/docs/fonts/sbviuG-CrcABsuQ0sUqA2Q.woff2"
+    }],
+    "style": "normal",
+    "weight": 400
+  }]
+}
+
+var t2_DocumentLocksValues = [{
+  "e": 1497567882639,
+  "dlKey": [docId1],
+  "sId": "652765aae3aaa80e"
+}]
+
+var t2_DocumentLocksValues = [{
+  "e": 1497567882639,
+  "dlKey": [docId1],
+  "sId": "652765aae3aaa80e"
+}]
+
+var t5_SyncObjectsValues = [{
+  "keyPath": ["syncMap", "applicationFonts", "1"],
+  "state": {
+    "hashValue": "00000000"
+  },
+  "data": {
+    "value": []
+  }
+}, {
+  "keyPath": ["syncMap", "domainFonts", "0"],
+  "state": {
+    "hashValue": "00000000"
+  },
+  "data": {
+    "value": []
+  }
+}, {
+  "keyPath": ["syncMap", "preferences", "docs-fonts"],
+  "state": {
+    "timestamp": 1493424239125432
+  },
+  "data": {
+    "familyList": ["Calibri", "Cambria", "Consolas", "Corsiva", "Droid Sans", "Droid Serif", "Syncopate", "Ubuntu", "Architects Daughter"],
+    "recentlyUsedFamilyList": ["Courier New", "Architects Daughter", "Arial", "Consolas", "Calibri"]
+  }
+}, {
+  "keyPath": ["syncMap", "preferences", "docs-global_promos", "0"],
+  "state": {
+    "timestamp": 1487376040788376
+  },
+  "data": {
+    "editorTemplatesAnnounce": true,
+    "chartImport": true,
+    "editorDomainTemplatesAnnounce": true,
+    "docosTodos": true
+  }
+}, {
+  "keyPath": ["syncMap", "preferences", "docs-hats_dc"],
+  "state": {
+    "timestamp": 1493931503976574
+  },
+  "data": {
+    "value": 0
+  }
+}, {
+  "keyPath": ["syncMap", "preferences", "docs-hats_st"],
+  "state": {
+    "timestamp": 1493931503976574
+  },
+  "data": {
+    "value": false
+  }
+}, {
+  "keyPath": ["syncMap", "preferences", "docs-homescreen-aips"],
+  "state": {
+    "timestamp": 1471648465103773
+  },
+  "data": {
+    "value": true
+  }
+}, {
+  "keyPath": ["syncMap", "preferences", "docs-homescreen-ftbdct"],
+  "state": {
+    "timestamp": 1471648465103773
+  },
+  "data": {
+    "value": 0
+  }
+}, {
+  "keyPath": ["syncMap", "preferences", "docs-homescreen-dbs"],
+  "state": {
+    "timestamp": 1471648465103773
+  },
+  "data": {
+    "value": false
+  }
+}, {
+  "keyPath": ["syncMap", "preferences", "docs-homescreen-dv", "1"],
+  "state": {
+    "timestamp": 1471648465103773
+  },
+  "data": {
+    "view": 1
+  }
+}, {
+  "keyPath": ["syncMap", "preferences", "docs-homescreen-ht"],
+  "state": {
+    "timestamp": 1471648465103773
+  },
+  "data": {
+    "value": false
+  }
+}, {
+  "keyPath": ["syncMap", "preferences", "docs-homescreen-wws"],
+  "state": {
+    "timestamp": 1471648465103773
+  },
+  "data": {
+    "value": true
+  }
+}, {
+  "keyPath": ["syncMap", "preferences", "docs-autocorrect"],
+  "state": {
+    "timestamp": 1454360462073469
+  },
+  "data": {
+    "autocorrectLinks": false,
+    "autocorrectSmartQuotes": false,
+    "enableStringReplacement": false,
+    "ruleList": [],
+    "autocorrectParagraphDirection": true,
+    "autocorrectLists": false,
+    "autocorrectAutoCapitalization": false
+  }
+}, {
+  "keyPath": ["syncMap", "preferences", "docs-etg-lvt"],
+  "state": {
+    "timestamp": 1497567846039000
+  },
+  "data": {
+    "value": 0
+  }
+}, {
+  "keyPath": ["syncMap", "preferences", "docs-enable_braille"],
+  "state": {
+    "timestamp": 1497567846040000
+  },
+  "data": {
+    "value": false
+  }
+}, {
+  "keyPath": ["syncMap", "preferences", "docs-chrome", "1"],
+  "state": {
+    "timestamp": 1473701835604542
+  },
+  "data": {
+    "viewMode": 1
+  }
+}, {
+  "keyPath": ["syncMap", "preferences", "docs-voice_tips_shown"],
+  "state": {
+    "timestamp": 1456437957716583
+  },
+  "data": {
+    "value": true
+  }
+}, {
+  "keyPath": ["syncMap", "preferences", "docs-user_dictionary"],
+  "state": {
+    "timestamp": 1491353454131535
+  },
+  "data": {
+    "wordList": [{
+      "value": "eviction"
+    }, {
+      "value": "confirmation"
+    }, {
+      "value": "eviction"
+    }, {
+      "value": "confirmation"
+    }]
+  }
+}, {
+  "keyPath": ["syncMap", "preferences", "docs-screenreader"],
+  "state": {
+    "timestamp": 1497567846040000
+  },
+  "data": {
+    "value": false
+  }
+}, {
+  "keyPath": ["syncMap", "preferences", "docs-show_smart_todo", "1"],
+  "state": {
+    "timestamp": 1476131907463159
+  },
+  "data": {
+    "value": false
+  }
+}, {
+  "keyPath": ["syncMap", "preferences", "docs-mute_collaborators"],
+  "state": {
+    "timestamp": 1497567846040000
+  },
+  "data": {
+    "value": false
+  }
+}, {
+  "keyPath": ["syncMap", "preferences", "mae-show_addons_menu_promo"],
+  "state": {
+    "timestamp": 1459386493786044
+  },
+  "data": {
+    "value": true
+  }
+}, {
+  "keyPath": ["syncMap", "preferences", "mae-show_addons_promo"],
+  "state": {
+    "timestamp": 1459386493786044
+  },
+  "data": {
+    "value": ",klhpiejgjijjcglpcaanggahphcgckpm,ilphpcjkaeejldodghgfkdedmfpkhlni"
+  }
+}, {
+  "keyPath": ["syncMap", "preferences", "kix-nwv"],
+  "state": {
+    "timestamp": 1494526038528477
+  },
+  "data": {
+    "value": 2
+  }
+}, {
+  "keyPath": ["syncMap", "preferences", "kix-sr"],
+  "state": {
+    "timestamp": 1494526038528477
+  },
+  "data": {
+    "value": true
+  }
+}, {
+  "keyPath": ["syncMap", "preferences", "kix-ssc"],
+  "state": {
+    "timestamp": 1494526038528477
+  },
+  "data": {
+    "value": true
+  }
+}, {
+  "keyPath": ["syncMap", "preferences", "kix-ss"],
+  "state": {
+    "timestamp": 1497567846040000
+  },
+  "data": {
+    "defaultStyleSetId": "",
+    "styleSetList": []
+  }
+}, {
+  "keyPath": ["syncMap", "preferences", "kix-svo"],
+  "state": {
+    "timestamp": 1494526038528477
+  },
+  "data": {
+    "value": false
+  }
+}, {
+  "keyPath": ["syncMap", "preferences", "kix-vm"],
+  "state": {
+    "timestamp": 1494526038528477
+  },
+  "data": {
+    "value": 0
+  }
+}, {
+  "keyPath": ["syncMap", "preferences", "kix-ap", "1"],
+  "state": {
+    "timestamp": 1487376040788376
+  },
+  "data": {
+    "rtlControls": true,
+    "newImageFeatures": true,
+    "newChanges": true,
+    "navigationWidgetMenu": true,
+    "voiceCommands": true,
+    "kix-explore": true,
+    "editorScratchpadAnnounce": true
+  }
+}, {
+  "keyPath": ["syncMap", "preferences", "kix-ps"],
+  "state": {
+    "timestamp": 1497567846040000
+  },
+  "data": {
+    "documentStyle": {}
+  }
+}]
+
+var t17_DocumentLocksValue = {
+  "e": 1497567883944,
+  "dlKey": [docId1],
+  "sId": "652765aae3aaa80e"
+};
+
+var t17_DocumentsValue = {
+  "id": docId1,
+  "documentType": "kix",
+  "hpmdo": "",
+  "relevancyRank": 120,
+  "jobset": "prod",
+  "isFastTrack": "true",
+  "lastSyncedTimestamp": 1497567847903,
+  "lsst": 1497567846789,
+  "title": "Blob Storage Refactor",
+  "ind": "",
+  "lastModifiedServerTimestamp": 1493420139817,
+  "modelVersion": 0,
+  "featureVersion": 0,
+  "inc": "",
+  "acl": {
+    "ufa1a865c6eb48d97": 4
+  },
+  "docosKeyData": [null, null, 0, "", null, "0", [null, 1, null, 1, 1, 1], null, ["Fake Name", null, "//lh5.googleusercontent.com/-7TvIUEovWGE/AAAAAAAAAAI/AAAAAAAABUs/WoZoPBOY_iw/s96-k-no/photo.jpg", "100317903111359348790", 1, null, 0, "fake@email.com"], 1, docId1, null, 1, null, null, null, 0, 1, 1, 1, null, null, null, null, 1, 1, "/comments/u/100317903111359348790/c", 0, null, 1, null, null, 1, null, null, null, 1, 1, 1, 1, 0, null, 0, ["tf", 60000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [[5700016, 5700019, 5700028, 5700032, 5700042, 5700057, 5700058, 5700085, 5700100, 5700103, 5700105, 5700114, 5700127, 5700130, 5700136, 5700146, 5700162, 5700180, 5700187, 5700189, 5700213, 5700248, 5700250, 5700258, 5700266, 5700286, 5700333, 5700350, 5700362, 5700386, 5700394, 5700410, 5700446, 5700470, 5700505, 5700527, 5700547, 5700551, 5700567, 5700588, 5700591, 5700600, 5700611, 5700634, 5700638, 5700650, 5700658, 5700668, 5700672, 5700684, 5700784, 5700788, 5700808, 5700838, 5700892, 5700900, 5700908, 5700933, 5700937, 5700962, 5700978, 5700982, 5701022, 5701054, 5701062, 5701067, 5701075, 5701143, 5701167, 5701176, 5701192, 5701204, 5701224, 5701244, 5701248, 5701264, 5701284, 5701288, 5701302, 5701323, 5701358, 5701373, 5701401, 5701442, 5701540]], 125],
+  "ips": "",
+  "snapshotState": 1,
+  "lastServerSnapshotTimestamp": 1497567847750,
+  "rev": 818,
+  "rai": ["34WZV82YtTmOtA"],
+  "lss": "true",
+  "lsft": 1497567847428,
+  "lastWarmStartedTimestamp": 1497567847733,
+  "pendingQueueState": 1,
+  "startupHints": {
+    "fontFamilies": "[]"
+  }
+};
+
+var t17_PendingQueuesValue = {
+  "docId": docId1,
+  "r": 818,
+  "ra": ["34WZV82YtTmOtA"],
+  "b": [],
+  "t": "kix",
+  "u": false,
+  "uc": false,
+  "a": 4
+};
+
+var t17_DocumentCommandsValue = {
+  "dcKey": [docId1, 0, 833, 0],
+  "t": 1498165351321,
+  "c": [{
+    "ty": "is",
+    "ibi": 1,
+    "s": "Blob Paging and Disk-Backed Blobs\nOr, Sending Arbitrarily Sized Chunks of Data Over IPC \nFake Name (fake@email.com)\nGo Link: goto/BlobPaging\nBitly Link: bit.ly/BlobStorageRefactor\nPresentation: bit.ly/BlobStorageRefactorPreso\nNewer Shorter Presentation: bit.ly/BlobRefactorPreso2\nLightning talk: bit.ly/BlobLighting\nThe implementation document is slightly out of date\nUpdated implementation plan (now oldish): http://bit.ly/BlobPlan\nTOC:\nOverview\nProblems\nNew Constants/Variables\nProblem #1: Not Blocking Renderer on Disk\nSolution: Blob Registration protocol change\nProtocol\nLarge Blob Creation Operation Example\nPossible Generalizations\nBlob Item Segmentation Algorithm\nSaving Large Blob to Disk Immediately\nProblem #2: Reading Incomplete Blobs\nProblem #3: Paging Old Blobs to Disk\nLRU Paging with Consolidation and Chunking\nImplementation Plan\nSecurity Concerns\nHistograms\nInitial Proposed Solutions (old)\nMinor Problems (Done)\nNew Architecture (DONE)\nClass Structure and Responsibilities (DONE)\nOld Blob Architecture\nBlob Class Layout\nBlob Reading\nOverview\nEvery Blob that is allocated requires memory in the browser process.  Since there is not an infinite amount of memory, the blob storage context caps the amount of space available to 500 MB.  If more than that amount is needed, broken blobs are returned instead.\nBug: https://crbug.com/375297\n\nAnother point I think is important is allowing us to run well on a mobile device with very little ram.  We should be able to set the maximum in-memory value to values to as little as 32k or 64k so  we don’t use up too much precious memory that the rest of the browser (or phone) needs.\n\nThis problem can be simplified as “We need to send, store, and retrieve arbitrary chunks of data, where the data is owned by the browser.”\nProblems\nWe run out of memory for blobs, so we need to store them on disk.  Here are brief descriptions of the problems we need to solve:\nWe cannot page to disk with the current protocol as we will have to block the renderer’s main thread on disk IO\nSolution: Change the blob registration protocol so the browser can control the flow of data from the renderer\nSubproblem: Blobs that are larger than we can ever fit in memory should be written to disk right away instead of transported through the browser process\nSolution: Use the new blob registration protocol to give the renderer file handles to directly save the blob to disk, bypassing having to store the memory in the browser.\nThe blob can not be incomplete when the renderer asks to read from it\nSolution: Have the blob url request job asynchronously request the blob snapshot so that it can wait until the blob is done loading\nSubproblem: the only client that decomposes and reads blobs is upload_data_stream_builder.cc, so we need to convert that to be able to read asynchronously as well (or create a reader for the blob).\nWe need a way to decide what blobs are paged to disk when we don’t have enough memory to store new blobs\nSolution: Use LRU paging to disk for blob items, and reload them into memory when we read if there is room.\nSubproblem: We don’t want to store a ton of tiny files, so have a minimum file size that we fill when we need to page to disk.  To do this we’ll combine items until we reach the minimum size, and then page them all to disk, where each item refers to the same file but with different offsets & sizes.\nSee full sections below for more details.\nNew Constants/Variables\nConstants and variables referenced below\nThree constants, possibly based on platform (names WIP)\nkMaxTotalBlobAllocatedMemory - This is the total amount of physical memory allowed for backing blobs and temporarily storing data while we are saving to disk.\nkMaxBlobStorageMemory - This is the total amount of physical memory allowed for backing blobs in our in-memory store.  This does not count the temporary (or in-flight) memory used when saving blob items to disk. \nkMaxDiskUsage - This is the maximum amount of disk space allowed for backing blobs.\n"
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.17ddf87odalu",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.3frwszfqba7t",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "inline",
+    "id": "kix.4vqe0rhyml26",
+    "epm": {
+      "ee_eo": {
+        "eo_bo": {
+          "ln_c": "#000000",
+          "ln_s": 0,
+          "ln_w": 0
+        },
+        "eo_lco": {
+          "lc_oi": "",
+          "lc_cs": "",
+          "lc_ct": 0,
+          "lc_sci": ""
+        },
+        "i_wth": 468,
+        "eo_rd": null,
+        "d_src": null,
+        "eo_mb": 9,
+        "eo_at": null,
+        "eo_hb": false,
+        "eo_lc": null,
+        "eo_rtd": "",
+        "i_ht": 431.7897810218978,
+        "eo_ml": 9,
+        "d_id": "s7H59WnCwaiLn557zYMFyag",
+        "eo_mr": 9,
+        "eo_ad": null,
+        "d_revision": 1,
+        "eo_mt": 9,
+        "eo_type": 2
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.4w78bptejbi8",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.5jwc0ei4ropw",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.6brboydje59x",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.6cnvuowxwxt7",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.6zs4vbew5yo",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.7urt80f7f5d6",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.7xuyusqg0kc1",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.840zvlihzcv6",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.8jj6t32kzcu3",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.8rypgi58afy6",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.8vxk397yi0de",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.9ohq8xfsa38f",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "inline",
+    "id": "kix.9r0snihen9om",
+    "epm": {
+      "ee_eo": {
+        "eo_bo": {
+          "ln_c": "#000000",
+          "ln_s": 0,
+          "ln_w": 0
+        },
+        "eo_lco": {
+          "lc_oi": "",
+          "lc_cs": "",
+          "lc_ct": 0,
+          "lc_sci": ""
+        },
+        "i_wth": 429,
+        "eo_rd": null,
+        "d_src": null,
+        "eo_mb": 9,
+        "eo_at": null,
+        "eo_hb": false,
+        "eo_lc": null,
+        "eo_rtd": "",
+        "i_ht": 268.3767605633803,
+        "eo_ml": 9,
+        "d_id": "s0LpUG5JiZL0pm581OKSbKg",
+        "eo_mr": 9,
+        "eo_ad": null,
+        "d_revision": 1,
+        "eo_mt": 9,
+        "eo_type": 2
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.b3s50373x4rh",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.bczb0hyr0drl",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.bfiktoi24gpp",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.cohsf4ppj7dr",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.dnn7l4e26ebl",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.e2d1n8dfs1y7",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.eafhgu2h59wf",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "inline",
+    "id": "kix.ef3hg0tvf9rx",
+    "epm": {
+      "ee_eo": {
+        "eo_bo": {
+          "ln_c": "#000000",
+          "ln_s": 0,
+          "ln_w": 0
+        },
+        "eo_lco": {
+          "lc_oi": "",
+          "lc_cs": "",
+          "lc_ct": 0,
+          "lc_sci": ""
+        },
+        "i_wth": 468,
+        "eo_rd": null,
+        "d_src": null,
+        "eo_mb": 9,
+        "eo_at": null,
+        "eo_hb": false,
+        "eo_lc": null,
+        "eo_rtd": "",
+        "i_ht": 334.45306633291614,
+        "eo_ml": 9,
+        "d_id": "sJRJ0rD2wTw5qbLRCEsdlvQ",
+        "eo_mr": 9,
+        "eo_ad": null,
+        "d_revision": 1,
+        "eo_mt": 9,
+        "eo_type": 2
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.eh3zlm4ytt1r",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.esq28jgh0nn9",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.j64wg7iystd9",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.lcl4383v79yy",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "positioned",
+    "id": "kix.lmtv23dspg80",
+    "epm": {
+      "pe_lo": 342.375,
+      "pe_l": 0,
+      "ee_eo": {
+        "eo_bo": {
+          "ln_c": "#000000",
+          "ln_s": 0,
+          "ln_w": 0
+        },
+        "eo_lco": {
+          "lc_oi": "",
+          "lc_cs": "",
+          "lc_ct": 0,
+          "lc_sci": ""
+        },
+        "i_wth": 105.2468051118211,
+        "eo_rd": null,
+        "eo_mb": 1.5,
+        "eo_at": null,
+        "eo_hb": false,
+        "eo_lc": null,
+        "eo_rtd": "",
+        "i_crop": {
+          "crop_oxr": -0.5041322314049587,
+          "crop_oyr": 0,
+          "crop_rot": 0,
+          "crop_hr": 1,
+          "crop_wr": 2.0661157024793386
+        },
+        "i_ht": 136.125,
+        "i_rot": 0,
+        "i_clst": {
+          "cv": {
+            "op": "set",
+            "opValue": []
+          }
+        },
+        "eo_ml": 1.5,
+        "i_bri": 0,
+        "eo_mr": 1.5,
+        "i_src": "",
+        "eo_ad": "blob-two.jpeg",
+        "i_cid": "1su9Y66wM0ybTjeN4wO8SB8mwdjs045din1UuvA",
+        "i_cont": 0,
+        "i_opa": 1,
+        "eo_mt": 1.5,
+        "eo_type": 0
+      },
+      "pe_to": 1.5
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.m2guflu8h8ba",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "inline",
+    "id": "kix.m65eloxnwryq",
+    "epm": {
+      "ee_eo": {
+        "eo_bo": {
+          "ln_c": "#000000",
+          "ln_s": 0,
+          "ln_w": 0
+        },
+        "eo_lco": {
+          "lc_oi": "",
+          "lc_cs": "",
+          "lc_ct": 0,
+          "lc_sci": ""
+        },
+        "i_wth": 209.58385286783044,
+        "eo_rd": null,
+        "d_src": null,
+        "eo_mb": 9,
+        "eo_at": null,
+        "eo_hb": false,
+        "eo_lc": null,
+        "eo_rtd": "",
+        "i_ht": 250.875,
+        "eo_ml": 9,
+        "d_id": "sK_PE3kcVrNcOj4H_OQ68dA",
+        "eo_mr": 9,
+        "eo_ad": null,
+        "d_revision": 1,
+        "eo_mt": 9,
+        "eo_type": 2
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.mc3874qfzm30",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "inline",
+    "id": "kix.n0nqdn6uatqm",
+    "epm": {
+      "ee_eo": {
+        "eo_bo": {
+          "ln_c": "#000000",
+          "ln_s": 0,
+          "ln_w": 0
+        },
+        "eo_lco": {
+          "lc_oi": "",
+          "lc_cs": "",
+          "lc_ct": 0,
+          "lc_sci": ""
+        },
+        "i_wth": 465,
+        "eo_rd": null,
+        "d_src": null,
+        "eo_mb": 9,
+        "eo_at": null,
+        "eo_hb": false,
+        "eo_lc": null,
+        "eo_rtd": "",
+        "i_ht": 307.06161137440756,
+        "eo_ml": 9,
+        "d_id": "slhQoLTK6Pv4YLkVkKPt3Pw",
+        "eo_mr": 9,
+        "eo_ad": null,
+        "d_revision": 1,
+        "eo_mt": 9,
+        "eo_type": 2
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.oiqjnmz88nzx",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.opetvrhgi3bm",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.opgg6egrtcgs",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.oxvhlrb2xw1v",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.p502pqankhbv",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.p5ckf6crpnp8",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.pksg57f4dsrs",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.py128h7n6f0s",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.qg8i90yq88ma",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.rj4ox9tg28jk",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.rod9b82kyj62",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.rx5l818si0do",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.rxvj3kkvioc1",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "positioned",
+    "id": "kix.sgwv5pmlzp03",
+    "epm": {
+      "pe_lo": 346.125,
+      "pe_l": 0,
+      "ee_eo": {
+        "eo_bo": {
+          "ln_c": "#000000",
+          "ln_s": 0,
+          "ln_w": 0
+        },
+        "eo_lco": {
+          "lc_oi": "",
+          "lc_cs": "",
+          "lc_ct": 0,
+          "lc_sci": ""
+        },
+        "i_wth": 98.49697885196377,
+        "eo_rd": null,
+        "eo_mb": 1.5,
+        "eo_at": null,
+        "eo_hb": false,
+        "eo_lc": null,
+        "eo_rtd": "",
+        "i_crop": {
+          "crop_oxr": -0.5887,
+          "crop_oyr": -0.0263,
+          "crop_rot": 0,
+          "crop_hr": 1.0455,
+          "crop_wr": 2.1686
+        },
+        "i_ht": 194.0625,
+        "i_rot": 0,
+        "i_clst": {
+          "cv": {
+            "op": "set",
+            "opValue": []
+          }
+        },
+        "eo_ml": 1.5,
+        "i_bri": 0,
+        "eo_mr": 1.5,
+        "i_src": "",
+        "eo_ad": "eye-guys.jpeg",
+        "i_cid": "1-lrzBLDJBcGKo6glr2S-ttncePU4OFfwgkfWig",
+        "i_cont": 0,
+        "i_opa": 1,
+        "eo_mt": 1.5,
+        "eo_type": 0
+      },
+      "pe_to": 3
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.tw5o2hd4cx5z",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.tztd8mz77qe4",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.uf15fzrkyee2",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.vjmji7wmrhoj",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.vnt9jew4ewcv",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 13,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "",
+          "b_a": 2,
+          "b_sn": 1,
+          "b_gt": 15,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0.",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 10,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "inline",
+    "id": "kix.vpigx3wccr1w",
+    "epm": {
+      "ee_eo": {
+        "eo_bo": {
+          "ln_c": "#000000",
+          "ln_s": 0,
+          "ln_w": 0
+        },
+        "eo_lco": {
+          "lc_oi": "",
+          "lc_cs": "",
+          "lc_ct": 0,
+          "lc_sci": ""
+        },
+        "i_wth": 468,
+        "eo_rd": null,
+        "d_src": null,
+        "eo_mb": 9,
+        "eo_at": null,
+        "eo_hb": false,
+        "eo_lc": null,
+        "eo_rtd": "",
+        "i_ht": 357.9686520376176,
+        "eo_ml": 9,
+        "d_id": "sxSGt6c5PrwbVPi0vk57LyA",
+        "eo_mr": 9,
+        "eo_ad": null,
+        "d_revision": 1,
+        "eo_mt": 9,
+        "eo_type": 2
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.vwnqmpm4z6ir",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.worwmy6t3q2",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.x7lgb6dgru3w",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.xk0hwksq0ota",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.xvz7jri5uaqv",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.yzbm5ohkpcis",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "ae",
+    "et": "list",
+    "id": "kix.zb9opbpcomp7",
+    "epm": {
+      "le_nb": {
+        "nl_4": {
+          "b_gf": "%4",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 162,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 180
+        },
+        "nl_3": {
+          "b_gf": "%3",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 126,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 144
+        },
+        "nl_2": {
+          "b_gf": "%2",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 90,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 108
+        },
+        "nl_1": {
+          "b_gf": "%1",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 54,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 72
+        },
+        "nl_8": {
+          "b_gf": "%8",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 306,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 324
+        },
+        "nl_7": {
+          "b_gf": "%7",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 270,
+          "b_gs": "○",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 288
+        },
+        "nl_6": {
+          "b_gf": "%6",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 234,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 252
+        },
+        "nl_5": {
+          "b_gf": "%5",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 198,
+          "b_gs": "■",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 216
+        },
+        "nl_0": {
+          "b_gf": "%0",
+          "b_ts": {
+            "ts_un": false,
+            "ts_un_i": false,
+            "ts_sc": false,
+            "ts_st_i": true,
+            "ts_bgc": null,
+            "ts_fs_i": true,
+            "ts_bgc_i": true,
+            "ts_ff_i": true,
+            "ts_bd_i": true,
+            "ts_va_i": true,
+            "ts_fs": 11,
+            "ts_ff": "Arial",
+            "ts_bd": false,
+            "ts_tw": 400,
+            "ts_it_i": true,
+            "ts_fgc": "#000000",
+            "ts_fgc_i": true,
+            "ts_it": false,
+            "ts_va": "nor",
+            "ts_st": false,
+            "ts_sc_i": true
+          },
+          "b_ifl": 18,
+          "b_gs": "●",
+          "b_a": 0,
+          "b_sn": 1,
+          "b_gt": 9,
+          "b_il": 36
+        }
+      }
+    }
+  }, {
+    "ty": "te",
+    "id": "kix.lmtv23dspg80",
+    "spi": 455
+  }, {
+    "ty": "te",
+    "id": "kix.sgwv5pmlzp03",
+    "spi": 717
+  }, {
+    "ty": "as",
+    "st": "headings",
+    "si": 0,
+    "ei": 0,
+    "sm": {
+      "hs_h3": {
+        "sdef_ps": {
+          "ps_sb_i": false,
+          "ps_sa_i": false,
+          "ps_sa": 0,
+          "ps_sb": 8
+        },
+        "sdef_ts": {
+          "ts_ff_i": false,
+          "ts_fgc": "#666666",
+          "ts_fgc_i": false,
+          "ts_fs": 12,
+          "ts_ff": "Trebuchet MS",
+          "ts_fs_i": false
+        }
+      },
+      "hs_t": {
+        "sdef_ps": {
+          "ps_sb_i": false,
+          "ps_sa_i": false,
+          "ps_sa": 0,
+          "ps_sb": 0
+        },
+        "sdef_ts": {
+          "ts_ff_i": false,
+          "ts_bd_i": true,
+          "ts_fs": 21,
+          "ts_ff": "Trebuchet MS",
+          "ts_bd": false,
+          "ts_fs_i": false
+        }
+      },
+      "hs_h2": {
+        "sdef_ps": {
+          "ps_sb_i": false,
+          "ps_sa_i": false,
+          "ps_sa": 0,
+          "ps_sb": 10
+        },
+        "sdef_ts": {
+          "ts_ff_i": false,
+          "ts_fs": 13,
+          "ts_ff": "Trebuchet MS",
+          "ts_fs_i": false
+        }
+      },
+      "hs_h1": {
+        "sdef_ps": {
+          "ps_sb_i": false,
+          "ps_sa_i": false,
+          "ps_sa": 0,
+          "ps_sb": 10
+        },
+        "sdef_ts": {
+          "ts_ff_i": false,
+          "ts_bd_i": true,
+          "ts_fs": 16,
+          "ts_ff": "Trebuchet MS",
+          "ts_bd": false,
+          "ts_fs_i": false
+        }
+      },
+      "hs_st": {
+        "sdef_ps": {
+          "ps_sb_i": false,
+          "ps_sa_i": false,
+          "ps_sa": 10,
+          "ps_sb": 0
+        },
+        "sdef_ts": {
+          "ts_ff_i": false,
+          "ts_fs": 13,
+          "ts_ff": "Trebuchet MS",
+          "ts_fs_i": false
+        }
+      },
+      "hs_h6": {
+        "sdef_ps": {
+          "ps_sb_i": false,
+          "ps_sa_i": false,
+          "ps_sa": 0,
+          "ps_sb": 8
+        },
+        "sdef_ts": {
+          "ts_ff_i": false,
+          "ts_fgc": "#666666",
+          "ts_fgc_i": false,
+          "ts_it": true,
+          "ts_bd_i": true,
+          "ts_fs": 11,
+          "ts_ff": "Trebuchet MS",
+          "ts_it_i": false,
+          "ts_bd": false,
+          "ts_fs_i": false
+        }
+      },
+      "hs_h5": {
+        "sdef_ps": {
+          "ps_sb_i": false,
+          "ps_sa_i": false,
+          "ps_sa": 0,
+          "ps_sb": 8
+        },
+        "sdef_ts": {
+          "ts_ff_i": false,
+          "ts_fgc": "#666666",
+          "ts_fgc_i": false,
+          "ts_bd_i": true,
+          "ts_ff": "Trebuchet MS",
+          "ts_bd": false
+        }
+      },
+      "hs_h4": {
+        "sdef_ps": {
+          "ps_sb_i": false,
+          "ps_sa_i": false,
+          "ps_sa": 0,
+          "ps_sb": 8
+        },
+        "sdef_ts": {
+          "ts_ff_i": false,
+          "ts_un": true,
+          "ts_fgc": "#666666",
+          "ts_un_i": false,
+          "ts_fgc_i": false,
+          "ts_bd_i": true,
+          "ts_fs": 11,
+          "ts_ff": "Trebuchet MS",
+          "ts_bd": false,
+          "ts_fs_i": false
+        }
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "language",
+    "si": 0,
+    "ei": 0,
+    "sm": {
+      "lgs_l": "en"
+    }
+  }, {
+    "ty": "as",
+    "st": "list",
+    "si": 34,
+    "ei": 34,
+    "sm": {
+      "ls_ts": {
+        "ts_un": false,
+        "ts_un_i": true,
+        "ts_sc": false,
+        "ts_st_i": true,
+        "ts_bgc": null,
+        "ts_fs_i": true,
+        "ts_bgc_i": true,
+        "ts_ff_i": true,
+        "ts_bd_i": true,
+        "ts_va_i": true,
+        "ts_fs": 11,
+        "ts_ff": "Arial",
+        "ts_bd": false,
+        "ts_tw": 400,
+        "ts_it_i": true,
+        "ts_fgc": "#000000",
+        "ts_fgc_i": true,
+        "ts_it": false,
+        "ts_va": "nor",
+        "ts_st": false,
+        "ts_sc_i": true
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 34,
+    "ei": 34,
+    "sm": {
+      "ps_klt_i": false,
+      "ps_awao_i": true,
+      "ps_kwn": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": true,
+      "ps_ir_i": true,
+      "ps_al_i": false,
+      "ps_hdid": "h.kdck3r5zn2zx",
+      "ps_sb_i": true,
+      "ps_ifl": 54,
+      "ps_sa_i": true,
+      "ps_klt": true,
+      "ps_hd": 100,
+      "ps_kwn_i": false,
+      "ps_al": 1,
+      "ps_ifl_i": true,
+      "ps_il": 72
+    }
+  }, {
+    "ty": "as",
+    "st": "list",
+    "si": 89,
+    "ei": 89,
+    "sm": {
+      "ls_ts": {
+        "ts_un": false,
+        "ts_un_i": true,
+        "ts_sc": false,
+        "ts_st_i": true,
+        "ts_bgc": null,
+        "ts_fs_i": true,
+        "ts_bgc_i": true,
+        "ts_ff_i": true,
+        "ts_bd_i": true,
+        "ts_va_i": true,
+        "ts_fs": 11,
+        "ts_ff": "Arial",
+        "ts_bd": false,
+        "ts_tw": 400,
+        "ts_it_i": true,
+        "ts_fgc": "#000000",
+        "ts_fgc_i": true,
+        "ts_it": false,
+        "ts_va": "nor",
+        "ts_st": false,
+        "ts_sc_i": true
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 89,
+    "ei": 89,
+    "sm": {
+      "ps_klt_i": false,
+      "ps_awao_i": true,
+      "ps_kwn": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_sa": 10,
+      "ps_il_i": true,
+      "ps_ir_i": true,
+      "ps_al_i": false,
+      "ps_hdid": "h.omye9x3ekfz7",
+      "ps_sb_i": true,
+      "ps_ifl": 54,
+      "ps_sa_i": false,
+      "ps_klt": true,
+      "ps_hd": 101,
+      "ps_kwn_i": false,
+      "ps_al": 1,
+      "ps_ifl_i": true,
+      "ps_il": 72
+    }
+  }, {
+    "ty": "as",
+    "st": "list",
+    "si": 123,
+    "ei": 123,
+    "sm": {
+      "ls_ts": {
+        "ts_un": false,
+        "ts_un_i": true,
+        "ts_sc": false,
+        "ts_st_i": true,
+        "ts_bgc": null,
+        "ts_fs_i": true,
+        "ts_bgc_i": true,
+        "ts_ff_i": true,
+        "ts_bd_i": true,
+        "ts_va_i": true,
+        "ts_fs": 11,
+        "ts_ff": "Arial",
+        "ts_bd": false,
+        "ts_tw": 400,
+        "ts_it_i": true,
+        "ts_fgc": "#000000",
+        "ts_fgc_i": true,
+        "ts_it": false,
+        "ts_va": "nor",
+        "ts_st": false,
+        "ts_sc_i": true
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 123,
+    "ei": 123,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": true,
+      "ps_ir_i": true,
+      "ps_al_i": false,
+      "ps_sb_i": true,
+      "ps_ifl": 54,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_al": 1,
+      "ps_ifl_i": true,
+      "ps_il": 72
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 148,
+    "ei": 148,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": true,
+      "ps_ir_i": true,
+      "ps_al_i": false,
+      "ps_sb_i": true,
+      "ps_ifl": 54,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_al": 1,
+      "ps_ifl_i": true,
+      "ps_il": 72
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 187,
+    "ei": 187,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": true,
+      "ps_ir_i": true,
+      "ps_al_i": false,
+      "ps_sb_i": true,
+      "ps_ifl": 54,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_al": 1,
+      "ps_ifl_i": true,
+      "ps_il": 72
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 233,
+    "ei": 233,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": true,
+      "ps_ir_i": true,
+      "ps_al_i": false,
+      "ps_sb_i": true,
+      "ps_ifl": 54,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_al": 1,
+      "ps_ifl_i": true,
+      "ps_il": 72
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 287,
+    "ei": 287,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": true,
+      "ps_ir_i": true,
+      "ps_al_i": false,
+      "ps_sb_i": true,
+      "ps_ifl": 54,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_al": 1,
+      "ps_ifl_i": true,
+      "ps_il": 72
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 323,
+    "ei": 323,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": true,
+      "ps_ir_i": true,
+      "ps_al_i": false,
+      "ps_sb_i": true,
+      "ps_ifl": 54,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_al": 1,
+      "ps_ifl_i": true,
+      "ps_il": 72
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 375,
+    "ei": 375,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": true,
+      "ps_ir_i": true,
+      "ps_al_i": false,
+      "ps_sb_i": true,
+      "ps_ifl": 54,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_al": 1,
+      "ps_ifl_i": true,
+      "ps_il": 72
+    }
+  }, {
+    "ty": "as",
+    "st": "list",
+    "si": 440,
+    "ei": 440,
+    "sm": {
+      "ls_ts": {
+        "ts_un": false,
+        "ts_un_i": true,
+        "ts_sc": false,
+        "ts_st_i": true,
+        "ts_bgc": null,
+        "ts_fs_i": true,
+        "ts_bgc_i": true,
+        "ts_ff_i": true,
+        "ts_bd_i": true,
+        "ts_va_i": true,
+        "ts_fs": 11,
+        "ts_ff": "Arial",
+        "ts_bd": false,
+        "ts_tw": 400,
+        "ts_it_i": true,
+        "ts_fgc": "#000000",
+        "ts_fgc_i": true,
+        "ts_it": false,
+        "ts_va": "nor",
+        "ts_st": false,
+        "ts_sc_i": true
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 440,
+    "ei": 440,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": true,
+      "ps_ir_i": true,
+      "ps_al_i": false,
+      "ps_sb_i": true,
+      "ps_ifl": 54,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_al": 1,
+      "ps_ifl_i": true,
+      "ps_il": 72
+    }
+  }, {
+    "ty": "as",
+    "st": "list",
+    "si": 445,
+    "ei": 445,
+    "sm": {
+      "ls_ts": {
+        "ts_un": false,
+        "ts_un_i": true,
+        "ts_sc": false,
+        "ts_st_i": true,
+        "ts_bgc": null,
+        "ts_fs_i": true,
+        "ts_bgc_i": true,
+        "ts_ff_i": true,
+        "ts_bd_i": true,
+        "ts_va_i": true,
+        "ts_fs": 11,
+        "ts_ff": "Arial",
+        "ts_bd": false,
+        "ts_tw": 400,
+        "ts_it_i": true,
+        "ts_fgc": "#000000",
+        "ts_fgc_i": true,
+        "ts_it": false,
+        "ts_va": "nor",
+        "ts_st": false,
+        "ts_sc_i": true
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 445,
+    "ei": 445,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": true,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_sb_i": true,
+      "ps_ifl": 54,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": true,
+      "ps_il": 72
+    }
+  }, {
+    "ty": "as",
+    "st": "autogen",
+    "si": 446,
+    "ei": 446,
+    "sm": {
+      "autogen_type": 0
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 455,
+    "ei": 455,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": false,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_sb_i": true,
+      "ps_ifl": 18,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": false,
+      "ps_il": 18
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 464,
+    "ei": 464,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": false,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_sb_i": true,
+      "ps_ifl": 18,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": false,
+      "ps_il": 18
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 488,
+    "ei": 488,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": false,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_sb_i": true,
+      "ps_ifl": 18,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": false,
+      "ps_il": 18
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 530,
+    "ei": 530,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": false,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_sb_i": true,
+      "ps_ifl": 18,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": false,
+      "ps_il": 18
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 574,
+    "ei": 574,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": false,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_sb_i": true,
+      "ps_ifl": 18,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": false,
+      "ps_il": 18
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 583,
+    "ei": 583,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": false,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_sb_i": true,
+      "ps_ifl": 36,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": false,
+      "ps_il": 36
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 621,
+    "ei": 621,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": false,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_sb_i": true,
+      "ps_ifl": 36,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": false,
+      "ps_il": 36
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 646,
+    "ei": 646,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": false,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_sb_i": true,
+      "ps_ifl": 36,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": false,
+      "ps_il": 36
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 679,
+    "ei": 679,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": false,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_sb_i": true,
+      "ps_ifl": 36,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": false,
+      "ps_il": 36
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 717,
+    "ei": 717,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": false,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_sb_i": true,
+      "ps_ifl": 36,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": false,
+      "ps_il": 36
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 754,
+    "ei": 754,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": false,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_sb_i": true,
+      "ps_ifl": 18,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": false,
+      "ps_il": 18
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 791,
+    "ei": 791,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": false,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_sb_i": true,
+      "ps_ifl": 18,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": false,
+      "ps_il": 18
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 834,
+    "ei": 834,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": false,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_sb_i": true,
+      "ps_ifl": 36,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": false,
+      "ps_il": 36
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 854,
+    "ei": 854,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": false,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_sb_i": true,
+      "ps_ifl": 18,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": false,
+      "ps_il": 18
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 872,
+    "ei": 872,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": false,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_sb_i": true,
+      "ps_ifl": 18,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": false,
+      "ps_il": 18
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 883,
+    "ei": 883,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": false,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_sb_i": true,
+      "ps_ifl": 18,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": false,
+      "ps_il": 18
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 916,
+    "ei": 916,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": false,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_sb_i": true,
+      "ps_ifl": 18,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": false,
+      "ps_il": 18
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 938,
+    "ei": 938,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": false,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_sb_i": true,
+      "ps_ifl": 18,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": false,
+      "ps_il": 18
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 962,
+    "ei": 962,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": false,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_sb_i": true,
+      "ps_ifl": 18,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": false,
+      "ps_il": 18
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 1006,
+    "ei": 1006,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": false,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_sb_i": true,
+      "ps_ifl": 36,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": false,
+      "ps_il": 36
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 1028,
+    "ei": 1028,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": false,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_sb_i": true,
+      "ps_ifl": 18,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": false,
+      "ps_il": 18
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 1046,
+    "ei": 1046,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": false,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_sb_i": true,
+      "ps_ifl": 54,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": false,
+      "ps_il": 54
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 1059,
+    "ei": 1059,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": false,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_sb_i": true,
+      "ps_ifl": 54,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": false,
+      "ps_il": 54
+    }
+  }, {
+    "ty": "as",
+    "st": "list",
+    "si": 1069,
+    "ei": 1069,
+    "sm": {
+      "ls_ts": {
+        "ts_un": false,
+        "ts_un_i": true,
+        "ts_sc": false,
+        "ts_st_i": true,
+        "ts_bgc": null,
+        "ts_fs_i": true,
+        "ts_bgc_i": true,
+        "ts_ff_i": true,
+        "ts_bd_i": true,
+        "ts_va_i": true,
+        "ts_fs": 11,
+        "ts_ff": "Arial",
+        "ts_bd": false,
+        "ts_tw": 400,
+        "ts_it_i": true,
+        "ts_fgc": "#000000",
+        "ts_fgc_i": true,
+        "ts_it": false,
+        "ts_va": "nor",
+        "ts_st": false,
+        "ts_sc_i": true
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 1069,
+    "ei": 1069,
+    "sm": {
+      "ps_klt_i": false,
+      "ps_awao_i": true,
+      "ps_kwn": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": true,
+      "ps_sb": 10,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_hdid": "h.k3bdsw8sa94",
+      "ps_sb_i": false,
+      "ps_ifl": 54,
+      "ps_sa_i": true,
+      "ps_klt": true,
+      "ps_hd": 1,
+      "ps_kwn_i": false,
+      "ps_ifl_i": true,
+      "ps_il": 72
+    }
+  }, {
+    "ty": "as",
+    "st": "list",
+    "si": 1331,
+    "ei": 1331,
+    "sm": {
+      "ls_ts": {
+        "ts_un": false,
+        "ts_un_i": true,
+        "ts_sc": false,
+        "ts_st_i": true,
+        "ts_bgc": null,
+        "ts_fs_i": true,
+        "ts_bgc_i": true,
+        "ts_ff_i": true,
+        "ts_bd_i": true,
+        "ts_va_i": true,
+        "ts_fs": 11,
+        "ts_ff": "Arial",
+        "ts_bd": false,
+        "ts_tw": 400,
+        "ts_it_i": true,
+        "ts_fgc": "#000000",
+        "ts_fgc_i": true,
+        "ts_it": false,
+        "ts_va": "nor",
+        "ts_st": false,
+        "ts_sc_i": true
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 1331,
+    "ei": 1331,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": true,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_sb_i": true,
+      "ps_ifl": 54,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": true,
+      "ps_il": 72
+    }
+  }, {
+    "ty": "as",
+    "st": "list",
+    "si": 1361,
+    "ei": 1361,
+    "sm": {
+      "ls_ts": {
+        "ts_un": false,
+        "ts_un_i": true,
+        "ts_sc": false,
+        "ts_st_i": true,
+        "ts_bgc": null,
+        "ts_fs_i": true,
+        "ts_bgc_i": true,
+        "ts_ff_i": true,
+        "ts_bd_i": true,
+        "ts_va_i": true,
+        "ts_fs": 11,
+        "ts_ff": "Arial",
+        "ts_bd": false,
+        "ts_tw": 400,
+        "ts_it_i": true,
+        "ts_fgc": "#000000",
+        "ts_fgc_i": true,
+        "ts_it": false,
+        "ts_va": "nor",
+        "ts_st": false,
+        "ts_sc_i": true
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 1361,
+    "ei": 1361,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": true,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_sb_i": true,
+      "ps_ifl": 54,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": true,
+      "ps_il": 72
+    }
+  }, {
+    "ty": "as",
+    "st": "list",
+    "si": 1362,
+    "ei": 1362,
+    "sm": {
+      "ls_ts": {
+        "ts_un": false,
+        "ts_un_i": true,
+        "ts_sc": false,
+        "ts_st_i": true,
+        "ts_bgc": null,
+        "ts_fs_i": true,
+        "ts_bgc_i": true,
+        "ts_ff_i": true,
+        "ts_bd_i": true,
+        "ts_va_i": true,
+        "ts_fs": 11,
+        "ts_ff": "Arial",
+        "ts_bd": false,
+        "ts_tw": 400,
+        "ts_it_i": true,
+        "ts_fgc": "#000000",
+        "ts_fgc_i": true,
+        "ts_it": false,
+        "ts_va": "nor",
+        "ts_st": false,
+        "ts_sc_i": true
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 1362,
+    "ei": 1362,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": true,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_sb_i": true,
+      "ps_ifl": 54,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": true,
+      "ps_il": 72
+    }
+  }, {
+    "ty": "as",
+    "st": "list",
+    "si": 1648,
+    "ei": 1648,
+    "sm": {
+      "ls_ts": {
+        "ts_un": false,
+        "ts_un_i": true,
+        "ts_sc": false,
+        "ts_st_i": true,
+        "ts_bgc": null,
+        "ts_fs_i": true,
+        "ts_bgc_i": true,
+        "ts_ff_i": true,
+        "ts_bd_i": true,
+        "ts_va_i": true,
+        "ts_fs": 11,
+        "ts_ff": "Arial",
+        "ts_bd": false,
+        "ts_tw": 400,
+        "ts_it_i": true,
+        "ts_fgc": "#000000",
+        "ts_fgc_i": true,
+        "ts_it": false,
+        "ts_va": "nor",
+        "ts_st": false,
+        "ts_sc_i": true
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 1648,
+    "ei": 1648,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": true,
+      "ps_ir_i": true,
+      "ps_al_i": false,
+      "ps_sb_i": true,
+      "ps_ifl": 54,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_al": 2,
+      "ps_ifl_i": true,
+      "ps_il": 72
+    }
+  }, {
+    "ty": "as",
+    "st": "list",
+    "si": 1649,
+    "ei": 1649,
+    "sm": {
+      "ls_ts": {
+        "ts_un": false,
+        "ts_un_i": true,
+        "ts_sc": false,
+        "ts_st_i": true,
+        "ts_bgc": null,
+        "ts_fs_i": true,
+        "ts_bgc_i": true,
+        "ts_ff_i": true,
+        "ts_bd_i": true,
+        "ts_va_i": true,
+        "ts_fs": 11,
+        "ts_ff": "Arial",
+        "ts_bd": false,
+        "ts_tw": 400,
+        "ts_it_i": true,
+        "ts_fgc": "#000000",
+        "ts_fgc_i": true,
+        "ts_it": false,
+        "ts_va": "nor",
+        "ts_st": false,
+        "ts_sc_i": true
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 1649,
+    "ei": 1649,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": true,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_sb_i": true,
+      "ps_ifl": 54,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": true,
+      "ps_il": 72
+    }
+  }, {
+    "ty": "as",
+    "st": "list",
+    "si": 1788,
+    "ei": 1788,
+    "sm": {
+      "ls_ts": {
+        "ts_un": false,
+        "ts_un_i": true,
+        "ts_sc": false,
+        "ts_st_i": true,
+        "ts_bgc": null,
+        "ts_fs_i": true,
+        "ts_bgc_i": true,
+        "ts_ff_i": true,
+        "ts_bd_i": true,
+        "ts_va_i": true,
+        "ts_fs": 11,
+        "ts_ff": "Arial",
+        "ts_bd": false,
+        "ts_tw": 400,
+        "ts_it_i": true,
+        "ts_fgc": "#000000",
+        "ts_fgc_i": true,
+        "ts_it": false,
+        "ts_va": "nor",
+        "ts_st": false,
+        "ts_sc_i": true
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 1788,
+    "ei": 1788,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": true,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_sb_i": true,
+      "ps_ifl": 54,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": true,
+      "ps_il": 72
+    }
+  }, {
+    "ty": "as",
+    "st": "list",
+    "si": 1797,
+    "ei": 1797,
+    "sm": {
+      "ls_ts": {
+        "ts_un": false,
+        "ts_un_i": true,
+        "ts_sc": false,
+        "ts_st_i": true,
+        "ts_bgc": null,
+        "ts_fs_i": true,
+        "ts_bgc_i": true,
+        "ts_ff_i": true,
+        "ts_bd_i": true,
+        "ts_va_i": true,
+        "ts_fs": 11,
+        "ts_ff": "Arial",
+        "ts_bd": false,
+        "ts_tw": 400,
+        "ts_it_i": true,
+        "ts_fgc": "#000000",
+        "ts_fgc_i": true,
+        "ts_it": false,
+        "ts_va": "nor",
+        "ts_st": false,
+        "ts_sc_i": true
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 1797,
+    "ei": 1797,
+    "sm": {
+      "ps_klt_i": false,
+      "ps_awao_i": true,
+      "ps_kwn": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": true,
+      "ps_sb": 10,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_hdid": "h.7v2myigy02v9",
+      "ps_sb_i": false,
+      "ps_ifl": 54,
+      "ps_sa_i": true,
+      "ps_klt": true,
+      "ps_hd": 1,
+      "ps_kwn_i": false,
+      "ps_ifl_i": true,
+      "ps_il": 72
+    }
+  }, {
+    "ty": "as",
+    "st": "list",
+    "si": 1926,
+    "ei": 1926,
+    "sm": {
+      "ls_ts": {
+        "ts_un": false,
+        "ts_un_i": true,
+        "ts_sc": false,
+        "ts_st_i": true,
+        "ts_bgc": null,
+        "ts_fs_i": true,
+        "ts_bgc_i": true,
+        "ts_ff_i": true,
+        "ts_bd_i": true,
+        "ts_va_i": true,
+        "ts_fs": 11,
+        "ts_ff": "Arial",
+        "ts_bd": false,
+        "ts_tw": 400,
+        "ts_it_i": true,
+        "ts_fgc": "#000000",
+        "ts_fgc_i": true,
+        "ts_it": false,
+        "ts_va": "nor",
+        "ts_st": false,
+        "ts_sc_i": true
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 1926,
+    "ei": 1926,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": true,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_sb_i": true,
+      "ps_ifl": 54,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": true,
+      "ps_il": 72
+    }
+  }, {
+    "ty": "as",
+    "st": "list",
+    "si": 2038,
+    "ei": 2038,
+    "sm": {
+      "ls_ts": {
+        "ts_un": false,
+        "ts_un_i": true,
+        "ts_sc": false,
+        "ts_st_i": true,
+        "ts_bgc": null,
+        "ts_fs_i": true,
+        "ts_bgc_i": true,
+        "ts_ff_i": true,
+        "ts_bd_i": true,
+        "ts_va_i": true,
+        "ts_fs": 11,
+        "ts_ff": "Arial",
+        "ts_bd": false,
+        "ts_tw": 400,
+        "ts_it_i": true,
+        "ts_fgc": "#000000",
+        "ts_fgc_i": true,
+        "ts_it": false,
+        "ts_va": "nor",
+        "ts_st": false,
+        "ts_sc_i": true
+      },
+      "ls_id": "kix.vnt9jew4ewcv"
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 2038,
+    "ei": 2038,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_sb_i": true,
+      "ps_awao_i": true,
+      "ps_ifl": 18,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": false,
+      "ps_ls_i": true,
+      "ps_il_i": false,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_il": 36
+    }
+  }, {
+    "ty": "as",
+    "st": "list",
+    "si": 2148,
+    "ei": 2148,
+    "sm": {
+      "ls_ts": {
+        "ts_un": false,
+        "ts_un_i": true,
+        "ts_sc": false,
+        "ts_st_i": true,
+        "ts_bgc": null,
+        "ts_fs_i": true,
+        "ts_bgc_i": true,
+        "ts_ff_i": true,
+        "ts_bd_i": true,
+        "ts_va_i": true,
+        "ts_fs": 11,
+        "ts_ff": "Arial",
+        "ts_bd": false,
+        "ts_tw": 400,
+        "ts_it_i": true,
+        "ts_fgc": "#000000",
+        "ts_fgc_i": true,
+        "ts_it": false,
+        "ts_va": "nor",
+        "ts_st": false,
+        "ts_sc_i": true
+      },
+      "ls_id": "kix.tw5o2hd4cx5z",
+      "ls_nest": 1
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 2148,
+    "ei": 2148,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_sb_i": true,
+      "ps_awao_i": true,
+      "ps_ifl": 54,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": false,
+      "ps_ls_i": true,
+      "ps_il_i": false,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_il": 72
+    }
+  }, {
+    "ty": "as",
+    "st": "list",
+    "si": 2301,
+    "ei": 2301,
+    "sm": {
+      "ls_ts": {
+        "ts_un": false,
+        "ts_un_i": true,
+        "ts_sc": false,
+        "ts_st_i": true,
+        "ts_bgc": null,
+        "ts_fs_i": true,
+        "ts_bgc_i": true,
+        "ts_ff_i": true,
+        "ts_bd_i": true,
+        "ts_va_i": true,
+        "ts_fs": 11,
+        "ts_ff": "Arial",
+        "ts_bd": false,
+        "ts_tw": 400,
+        "ts_it_i": true,
+        "ts_fgc": "#000000",
+        "ts_fgc_i": true,
+        "ts_it": false,
+        "ts_va": "nor",
+        "ts_st": false,
+        "ts_sc_i": true
+      },
+      "ls_id": "kix.tw5o2hd4cx5z",
+      "ls_nest": 1
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 2301,
+    "ei": 2301,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_sb_i": true,
+      "ps_awao_i": true,
+      "ps_ifl": 54,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": false,
+      "ps_ls_i": true,
+      "ps_il_i": false,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_il": 72
+    }
+  }, {
+    "ty": "as",
+    "st": "list",
+    "si": 2472,
+    "ei": 2472,
+    "sm": {
+      "ls_ts": {
+        "ts_un": false,
+        "ts_un_i": true,
+        "ts_sc": false,
+        "ts_st_i": true,
+        "ts_bgc": null,
+        "ts_fs_i": true,
+        "ts_bgc_i": true,
+        "ts_ff_i": true,
+        "ts_bd_i": true,
+        "ts_va_i": true,
+        "ts_fs": 11,
+        "ts_ff": "Arial",
+        "ts_bd": false,
+        "ts_tw": 400,
+        "ts_it_i": true,
+        "ts_fgc": "#000000",
+        "ts_fgc_i": true,
+        "ts_it": false,
+        "ts_va": "nor",
+        "ts_st": false,
+        "ts_sc_i": true
+      },
+      "ls_id": "kix.tw5o2hd4cx5z",
+      "ls_nest": 2
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 2472,
+    "ei": 2472,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_sb_i": true,
+      "ps_awao_i": true,
+      "ps_ifl": 90,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": false,
+      "ps_ls_i": true,
+      "ps_il_i": false,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_il": 108
+    }
+  }, {
+    "ty": "as",
+    "st": "list",
+    "si": 2542,
+    "ei": 2542,
+    "sm": {
+      "ls_ts": {
+        "ts_un": false,
+        "ts_un_i": true,
+        "ts_sc": false,
+        "ts_st_i": true,
+        "ts_bgc": null,
+        "ts_fs_i": true,
+        "ts_bgc_i": true,
+        "ts_ff_i": true,
+        "ts_bd_i": true,
+        "ts_va_i": true,
+        "ts_fs": 11,
+        "ts_ff": "Arial",
+        "ts_bd": false,
+        "ts_tw": 400,
+        "ts_it_i": true,
+        "ts_fgc": "#000000",
+        "ts_fgc_i": true,
+        "ts_it": false,
+        "ts_va": "nor",
+        "ts_st": false,
+        "ts_sc_i": true
+      },
+      "ls_id": "kix.tw5o2hd4cx5z"
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 2542,
+    "ei": 2542,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_sb_i": true,
+      "ps_awao_i": true,
+      "ps_ifl": 18,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": false,
+      "ps_ls_i": true,
+      "ps_il_i": false,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_il": 36
+    }
+  }, {
+    "ty": "as",
+    "st": "list",
+    "si": 2674,
+    "ei": 2674,
+    "sm": {
+      "ls_ts": {
+        "ts_un": false,
+        "ts_un_i": true,
+        "ts_sc": false,
+        "ts_st_i": true,
+        "ts_bgc": null,
+        "ts_fs_i": true,
+        "ts_bgc_i": true,
+        "ts_ff_i": true,
+        "ts_bd_i": true,
+        "ts_va_i": true,
+        "ts_fs": 11,
+        "ts_ff": "Arial",
+        "ts_bd": false,
+        "ts_tw": 400,
+        "ts_it_i": true,
+        "ts_fgc": "#000000",
+        "ts_fgc_i": true,
+        "ts_it": false,
+        "ts_va": "nor",
+        "ts_st": false,
+        "ts_sc_i": true
+      },
+      "ls_id": "kix.tw5o2hd4cx5z",
+      "ls_nest": 1
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 2674,
+    "ei": 2674,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_sb_i": true,
+      "ps_awao_i": true,
+      "ps_ifl": 54,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": false,
+      "ps_ls_i": true,
+      "ps_il_i": false,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_il": 72
+    }
+  }, {
+    "ty": "as",
+    "st": "list",
+    "si": 2872,
+    "ei": 2872,
+    "sm": {
+      "ls_ts": {
+        "ts_un": false,
+        "ts_un_i": true,
+        "ts_sc": false,
+        "ts_st_i": true,
+        "ts_bgc": null,
+        "ts_fs_i": true,
+        "ts_bgc_i": true,
+        "ts_ff_i": true,
+        "ts_bd_i": true,
+        "ts_va_i": true,
+        "ts_fs": 11,
+        "ts_ff": "Arial",
+        "ts_bd": false,
+        "ts_tw": 400,
+        "ts_it_i": true,
+        "ts_fgc": "#000000",
+        "ts_fgc_i": true,
+        "ts_it": false,
+        "ts_va": "nor",
+        "ts_st": false,
+        "ts_sc_i": true
+      },
+      "ls_id": "kix.tw5o2hd4cx5z",
+      "ls_nest": 1
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 2872,
+    "ei": 2872,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_sb_i": true,
+      "ps_awao_i": true,
+      "ps_ifl": 54,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": false,
+      "ps_ls_i": true,
+      "ps_il_i": false,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_il": 72
+    }
+  }, {
+    "ty": "as",
+    "st": "list",
+    "si": 2977,
+    "ei": 2977,
+    "sm": {
+      "ls_ts": {
+        "ts_un": false,
+        "ts_un_i": true,
+        "ts_sc": false,
+        "ts_st_i": true,
+        "ts_bgc": null,
+        "ts_fs_i": true,
+        "ts_bgc_i": true,
+        "ts_ff_i": true,
+        "ts_bd_i": true,
+        "ts_va_i": true,
+        "ts_fs": 11,
+        "ts_ff": "Arial",
+        "ts_bd": false,
+        "ts_tw": 400,
+        "ts_it_i": true,
+        "ts_fgc": "#000000",
+        "ts_fgc_i": true,
+        "ts_it": false,
+        "ts_va": "nor",
+        "ts_st": false,
+        "ts_sc_i": true
+      },
+      "ls_id": "kix.tw5o2hd4cx5z"
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 2977,
+    "ei": 2977,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_sb_i": true,
+      "ps_awao_i": true,
+      "ps_ifl": 18,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": false,
+      "ps_ls_i": true,
+      "ps_il_i": false,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_il": 36
+    }
+  }, {
+    "ty": "as",
+    "st": "list",
+    "si": 3085,
+    "ei": 3085,
+    "sm": {
+      "ls_ts": {
+        "ts_un": false,
+        "ts_un_i": true,
+        "ts_sc": false,
+        "ts_st_i": true,
+        "ts_bgc": null,
+        "ts_fs_i": true,
+        "ts_bgc_i": true,
+        "ts_ff_i": true,
+        "ts_bd_i": true,
+        "ts_va_i": true,
+        "ts_fs": 11,
+        "ts_ff": "Arial",
+        "ts_bd": false,
+        "ts_tw": 400,
+        "ts_it_i": true,
+        "ts_fgc": "#000000",
+        "ts_fgc_i": true,
+        "ts_it": false,
+        "ts_va": "nor",
+        "ts_st": false,
+        "ts_sc_i": true
+      },
+      "ls_id": "kix.tw5o2hd4cx5z",
+      "ls_nest": 1
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 3085,
+    "ei": 3085,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_sb_i": true,
+      "ps_awao_i": true,
+      "ps_ifl": 54,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": false,
+      "ps_ls_i": true,
+      "ps_il_i": false,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_il": 72
+    }
+  }, {
+    "ty": "as",
+    "st": "list",
+    "si": 3385,
+    "ei": 3385,
+    "sm": {
+      "ls_ts": {
+        "ts_un": false,
+        "ts_un_i": true,
+        "ts_sc": false,
+        "ts_st_i": true,
+        "ts_bgc": null,
+        "ts_fs_i": true,
+        "ts_bgc_i": true,
+        "ts_ff_i": true,
+        "ts_bd_i": true,
+        "ts_va_i": true,
+        "ts_fs": 11,
+        "ts_ff": "Arial",
+        "ts_bd": false,
+        "ts_tw": 400,
+        "ts_it_i": true,
+        "ts_fgc": "#000000",
+        "ts_fgc_i": true,
+        "ts_it": false,
+        "ts_va": "nor",
+        "ts_st": false,
+        "ts_sc_i": true
+      },
+      "ls_id": "kix.tw5o2hd4cx5z",
+      "ls_nest": 1
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 3385,
+    "ei": 3385,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_sb_i": true,
+      "ps_awao_i": true,
+      "ps_ifl": 54,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": false,
+      "ps_ls_i": true,
+      "ps_il_i": false,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_il": 72
+    }
+  }, {
+    "ty": "as",
+    "st": "list",
+    "si": 3427,
+    "ei": 3427,
+    "sm": {
+      "ls_ts": {
+        "ts_un": false,
+        "ts_un_i": true,
+        "ts_sc": false,
+        "ts_st_i": true,
+        "ts_bgc": null,
+        "ts_fs_i": true,
+        "ts_bgc_i": true,
+        "ts_ff_i": true,
+        "ts_bd_i": true,
+        "ts_va_i": true,
+        "ts_fs": 11,
+        "ts_ff": "Arial",
+        "ts_bd": false,
+        "ts_tw": 400,
+        "ts_it_i": true,
+        "ts_fgc": "#000000",
+        "ts_fgc_i": true,
+        "ts_it": false,
+        "ts_va": "nor",
+        "ts_st": false,
+        "ts_sc_i": true
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 3427,
+    "ei": 3427,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": true,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_sb_i": true,
+      "ps_ifl": 54,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": true,
+      "ps_il": 72
+    }
+  }, {
+    "ty": "as",
+    "st": "list",
+    "si": 3451,
+    "ei": 3451,
+    "sm": {
+      "ls_ts": {
+        "ts_un": false,
+        "ts_un_i": true,
+        "ts_sc": false,
+        "ts_st_i": true,
+        "ts_bgc": null,
+        "ts_fs_i": true,
+        "ts_bgc_i": true,
+        "ts_ff_i": true,
+        "ts_bd_i": true,
+        "ts_va_i": true,
+        "ts_fs": 11,
+        "ts_ff": "Arial",
+        "ts_bd": false,
+        "ts_tw": 400,
+        "ts_it_i": true,
+        "ts_fgc": "#000000",
+        "ts_fgc_i": true,
+        "ts_it": false,
+        "ts_va": "nor",
+        "ts_st": false,
+        "ts_sc_i": true
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 3451,
+    "ei": 3451,
+    "sm": {
+      "ps_klt_i": false,
+      "ps_awao_i": true,
+      "ps_kwn": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": true,
+      "ps_sb": 10,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_hdid": "h.bj7ep3s5qfyi",
+      "ps_sb_i": false,
+      "ps_ifl": 54,
+      "ps_sa_i": true,
+      "ps_klt": true,
+      "ps_hd": 1,
+      "ps_kwn_i": false,
+      "ps_ifl_i": true,
+      "ps_il": 72
+    }
+  }, {
+    "ty": "as",
+    "st": "list",
+    "si": 3492,
+    "ei": 3492,
+    "sm": {
+      "ls_ts": {
+        "ts_un": false,
+        "ts_un_i": true,
+        "ts_sc": false,
+        "ts_st_i": true,
+        "ts_bgc": null,
+        "ts_fs_i": true,
+        "ts_bgc_i": true,
+        "ts_ff_i": true,
+        "ts_bd_i": true,
+        "ts_va_i": true,
+        "ts_fs": 11,
+        "ts_ff": "Arial",
+        "ts_bd": false,
+        "ts_tw": 400,
+        "ts_it_i": true,
+        "ts_fgc": "#000000",
+        "ts_fgc_i": true,
+        "ts_it": false,
+        "ts_va": "nor",
+        "ts_st": false,
+        "ts_sc_i": true
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 3492,
+    "ei": 3492,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": true,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_sb_i": true,
+      "ps_ifl": 54,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": true,
+      "ps_il": 72
+    }
+  }, {
+    "ty": "as",
+    "st": "list",
+    "si": 3548,
+    "ei": 3548,
+    "sm": {
+      "ls_ts": {
+        "ts_un": false,
+        "ts_un_i": true,
+        "ts_sc": false,
+        "ts_st_i": true,
+        "ts_bgc": null,
+        "ts_fs_i": true,
+        "ts_bgc_i": true,
+        "ts_ff_i": true,
+        "ts_bd_i": true,
+        "ts_va_i": true,
+        "ts_fs": 11,
+        "ts_ff": "Arial",
+        "ts_bd": false,
+        "ts_tw": 400,
+        "ts_it_i": true,
+        "ts_fgc": "#000000",
+        "ts_fgc_i": true,
+        "ts_it": false,
+        "ts_va": "nor",
+        "ts_st": false,
+        "ts_sc_i": true
+      },
+      "ls_id": "kix.6zs4vbew5yo"
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 3548,
+    "ei": 3548,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": false,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_sb_i": true,
+      "ps_ifl": 18,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": false,
+      "ps_il": 36
+    }
+  }, {
+    "ty": "as",
+    "st": "list",
+    "si": 3707,
+    "ei": 3707,
+    "sm": {
+      "ls_ts": {
+        "ts_un": false,
+        "ts_un_i": true,
+        "ts_sc": false,
+        "ts_st_i": true,
+        "ts_bgc": null,
+        "ts_fs_i": true,
+        "ts_bgc_i": true,
+        "ts_ff_i": true,
+        "ts_bd_i": true,
+        "ts_va_i": true,
+        "ts_fs": 11,
+        "ts_ff": "Arial",
+        "ts_bd": false,
+        "ts_tw": 400,
+        "ts_it_i": true,
+        "ts_fgc": "#000000",
+        "ts_fgc_i": true,
+        "ts_it": false,
+        "ts_va": "nor",
+        "ts_st": false,
+        "ts_sc_i": true
+      },
+      "ls_id": "kix.6zs4vbew5yo",
+      "ls_nest": 1
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 3707,
+    "ei": 3707,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": false,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_sb_i": true,
+      "ps_ifl": 54,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": false,
+      "ps_il": 72
+    }
+  }, {
+    "ty": "as",
+    "st": "list",
+    "si": 3920,
+    "ei": 3920,
+    "sm": {
+      "ls_ts": {
+        "ts_un": false,
+        "ts_un_i": true,
+        "ts_sc": false,
+        "ts_st_i": true,
+        "ts_bgc": null,
+        "ts_fs_i": true,
+        "ts_bgc_i": true,
+        "ts_ff_i": true,
+        "ts_bd_i": true,
+        "ts_va_i": true,
+        "ts_fs": 11,
+        "ts_ff": "Arial",
+        "ts_bd": false,
+        "ts_tw": 400,
+        "ts_it_i": true,
+        "ts_fgc": "#000000",
+        "ts_fgc_i": true,
+        "ts_it": false,
+        "ts_va": "nor",
+        "ts_st": false,
+        "ts_sc_i": true
+      },
+      "ls_id": "kix.6zs4vbew5yo",
+      "ls_nest": 1
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 3920,
+    "ei": 3920,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": false,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_sb_i": true,
+      "ps_ifl": 54,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": false,
+      "ps_il": 72
+    }
+  }, {
+    "ty": "as",
+    "st": "list",
+    "si": 4004,
+    "ei": 4004,
+    "sm": {
+      "ls_ts": {
+        "ts_un": false,
+        "ts_un_i": true,
+        "ts_sc": false,
+        "ts_st_i": true,
+        "ts_bgc": null,
+        "ts_fs_i": true,
+        "ts_bgc_i": true,
+        "ts_ff_i": true,
+        "ts_bd_i": true,
+        "ts_va_i": true,
+        "ts_fs": 11,
+        "ts_ff": "Arial",
+        "ts_bd": false,
+        "ts_tw": 400,
+        "ts_it_i": true,
+        "ts_fgc": "#000000",
+        "ts_fgc_i": true,
+        "ts_it": false,
+        "ts_va": "nor",
+        "ts_st": false,
+        "ts_sc_i": true
+      },
+      "ls_id": "kix.6zs4vbew5yo",
+      "ls_nest": 1
+    }
+  }, {
+    "ty": "as",
+    "st": "paragraph",
+    "si": 4004,
+    "ei": 4004,
+    "sm": {
+      "ps_klt_i": true,
+      "ps_awao_i": true,
+      "ps_sm_i": true,
+      "ps_ls_i": true,
+      "ps_il_i": false,
+      "ps_ir_i": true,
+      "ps_al_i": true,
+      "ps_sb_i": true,
+      "ps_ifl": 54,
+      "ps_sa_i": true,
+      "ps_kwn_i": true,
+      "ps_ifl_i": false,
+      "ps_il": 72
+    }
+  }, {
+    "ty": "as",
+    "st": "doco_anchor",
+    "si": 1,
+    "ei": 137,
+    "sm": {
+      "das_a": {
+        "cv": {
+          "op": "set",
+          "opValue": ["kix.yhcto4hc4i8c"]
+        }
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "doco_anchor",
+    "si": 138,
+    "ei": 147,
+    "sm": {
+      "das_a": {
+        "cv": {
+          "op": "set",
+          "opValue": ["kix.if5xu7fce82g", "kix.yhcto4hc4i8c"]
+        }
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "doco_anchor",
+    "si": 148,
+    "ei": 445,
+    "sm": {
+      "das_a": {
+        "cv": {
+          "op": "set",
+          "opValue": ["kix.yhcto4hc4i8c"]
+        }
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "doco_anchor",
+    "si": 1061,
+    "ei": 1068,
+    "sm": {
+      "das_a": {
+        "cv": {
+          "op": "set",
+          "opValue": ["kix.kauy3vgsfpow", "kix.yhcto4hc4i8c"]
+        }
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "doco_anchor",
+    "si": 1069,
+    "ei": 1260,
+    "sm": {
+      "das_a": {
+        "cv": {
+          "op": "set",
+          "opValue": ["kix.yhcto4hc4i8c"]
+        }
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "doco_anchor",
+    "si": 1261,
+    "ei": 1330,
+    "sm": {
+      "das_a": {
+        "cv": {
+          "op": "set",
+          "opValue": ["kix.yhcto4hc4i8c", "kix.8f57r89qi4ga"]
+        }
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "doco_anchor",
+    "si": 1331,
+    "ei": 1797,
+    "sm": {
+      "das_a": {
+        "cv": {
+          "op": "set",
+          "opValue": ["kix.yhcto4hc4i8c"]
+        }
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "doco_anchor",
+    "si": 1798,
+    "ei": 1827,
+    "sm": {
+      "das_a": {
+        "cv": {
+          "op": "set",
+          "opValue": ["kix.yhcto4hc4i8c", "kix.j2nw689dmni4"]
+        }
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "doco_anchor",
+    "si": 1828,
+    "ei": 2472,
+    "sm": {
+      "das_a": {
+        "cv": {
+          "op": "set",
+          "opValue": ["kix.yhcto4hc4i8c"]
+        }
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "doco_anchor",
+    "si": 2473,
+    "ei": 2541,
+    "sm": {
+      "das_a": {
+        "cv": {
+          "op": "set",
+          "opValue": ["kix.yhcto4hc4i8c", "kix.2n30jyukfgb"]
+        }
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "doco_anchor",
+    "si": 2542,
+    "ei": 3085,
+    "sm": {
+      "das_a": {
+        "cv": {
+          "op": "set",
+          "opValue": ["kix.yhcto4hc4i8c"]
+        }
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "doco_anchor",
+    "si": 3086,
+    "ei": 3114,
+    "sm": {
+      "das_a": {
+        "cv": {
+          "op": "set",
+          "opValue": ["kix.yhcto4hc4i8c", "kix.8c0jixdu3hak"]
+        }
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "doco_anchor",
+    "si": 3115,
+    "ei": 3139,
+    "sm": {
+      "das_a": {
+        "cv": {
+          "op": "set",
+          "opValue": ["kix.yhcto4hc4i8c", "kix.8s7amlbsjn7t", "kix.8c0jixdu3hak"]
+        }
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "doco_anchor",
+    "si": 3140,
+    "ei": 3211,
+    "sm": {
+      "das_a": {
+        "cv": {
+          "op": "set",
+          "opValue": ["kix.yhcto4hc4i8c", "kix.8c0jixdu3hak"]
+        }
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "doco_anchor",
+    "si": 3212,
+    "ei": 3384,
+    "sm": {
+      "das_a": {
+        "cv": {
+          "op": "set",
+          "opValue": ["kix.yhcto4hc4i8c"]
+        }
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "doco_anchor",
+    "si": 3385,
+    "ei": 3385,
+    "sm": {
+      "das_a": {
+        "cv": {
+          "op": "set",
+          "opValue": ["kix.yhcto4hc4i8c", "kix.6hmdp7vyx59g"]
+        }
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "doco_anchor",
+    "si": 3386,
+    "ei": 3427,
+    "sm": {
+      "das_a": {
+        "cv": {
+          "op": "set",
+          "opValue": ["kix.yhcto4hc4i8c"]
+        }
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "doco_anchor",
+    "si": 3428,
+    "ei": 3430,
+    "sm": {
+      "das_a": {
+        "cv": {
+          "op": "set",
+          "opValue": ["kix.e75n5m1q7oa8", "kix.yhcto4hc4i8c", "kix.s0uxs8cbbwr9"]
+        }
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "doco_anchor",
+    "si": 3431,
+    "ei": 3431,
+    "sm": {
+      "das_a": {
+        "cv": {
+          "op": "set",
+          "opValue": ["kix.yhcto4hc4i8c"]
+        }
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "doco_anchor",
+    "si": 3432,
+    "ei": 3440,
+    "sm": {
+      "das_a": {
+        "cv": {
+          "op": "set",
+          "opValue": ["kix.yhcto4hc4i8c", "kix.5sg8y9o9rz3t"]
+        }
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "doco_anchor",
+    "si": 3441,
+    "ei": 3548,
+    "sm": {
+      "das_a": {
+        "cv": {
+          "op": "set",
+          "opValue": ["kix.yhcto4hc4i8c"]
+        }
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "doco_anchor",
+    "si": 3549,
+    "ei": 3577,
+    "sm": {
+      "das_a": {
+        "cv": {
+          "op": "set",
+          "opValue": ["kix.yhcto4hc4i8c", "kix.bujts1kcgem8"]
+        }
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "doco_anchor",
+    "si": 3578,
+    "ei": 4004,
+    "sm": {
+      "das_a": {
+        "cv": {
+          "op": "set",
+          "opValue": ["kix.yhcto4hc4i8c"]
+        }
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "link",
+    "si": 133,
+    "ei": 147,
+    "sm": {
+      "lnks_link": {
+        "lnk_type": 0,
+        "ulnk_url": "https://goto.google.com/blobpaging"
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "link",
+    "si": 161,
+    "ei": 186,
+    "sm": {
+      "lnks_link": {
+        "lnk_type": 0,
+        "ulnk_url": "https://bit.ly/BlobStorageRefactor"
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "link",
+    "si": 202,
+    "ei": 232,
+    "sm": {
+      "lnks_link": {
+        "lnk_type": 0,
+        "ulnk_url": "https://bit.ly/BlobStorageRefactorPreso"
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "link",
+    "si": 262,
+    "ei": 286,
+    "sm": {
+      "lnks_link": {
+        "lnk_type": 0,
+        "ulnk_url": "https://bit.ly/BlobRefactorPreso2"
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "link",
+    "si": 304,
+    "ei": 322,
+    "sm": {
+      "lnks_link": {
+        "lnk_type": 0,
+        "ulnk_url": "https://bit.ly/BlobLighting"
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "link",
+    "si": 418,
+    "ei": 439,
+    "sm": {
+      "lnks_link": {
+        "lnk_type": 0,
+        "ulnk_url": "http://bit.ly/BlobPlan"
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "link",
+    "si": 447,
+    "ei": 454,
+    "sm": {
+      "lnks_link": {
+        "lnk_type": 0,
+        "ulnk_url": "#heading=h.6j536qh9q421"
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "link",
+    "si": 456,
+    "ei": 463,
+    "sm": {
+      "lnks_link": {
+        "lnk_type": 0,
+        "ulnk_url": "#heading=h.7v2myigy02v9"
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "link",
+    "si": 465,
+    "ei": 487,
+    "sm": {
+      "lnks_link": {
+        "lnk_type": 0,
+        "ulnk_url": "#heading=h.bj7ep3s5qfyi"
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "link",
+    "si": 489,
+    "ei": 529,
+    "sm": {
+      "lnks_link": {
+        "lnk_type": 0,
+        "ulnk_url": "#heading=h.bqm98ofvga9v"
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "link",
+    "si": 531,
+    "ei": 573,
+    "sm": {
+      "lnks_link": {
+        "lnk_type": 0,
+        "ulnk_url": "#heading=h.vbtdulxhhl14"
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "link",
+    "si": 575,
+    "ei": 582,
+    "sm": {
+      "lnks_link": {
+        "lnk_type": 0,
+        "ulnk_url": "#heading=h.6ybips2ugstv"
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "link",
+    "si": 584,
+    "ei": 620,
+    "sm": {
+      "lnks_link": {
+        "lnk_type": 0,
+        "ulnk_url": "#heading=h.4s6lb7muqahj"
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "link",
+    "si": 622,
+    "ei": 645,
+    "sm": {
+      "lnks_link": {
+        "lnk_type": 0,
+        "ulnk_url": "#heading=h.8jiicja6lxhv"
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "link",
+    "si": 647,
+    "ei": 678,
+    "sm": {
+      "lnks_link": {
+        "lnk_type": 0,
+        "ulnk_url": "#heading=h.vq7tktd9d94q"
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "link",
+    "si": 680,
+    "ei": 716,
+    "sm": {
+      "lnks_link": {
+        "lnk_type": 0,
+        "ulnk_url": "#heading=h.ihdxamul0gvf"
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "link",
+    "si": 718,
+    "ei": 753,
+    "sm": {
+      "lnks_link": {
+        "lnk_type": 0,
+        "ulnk_url": "#heading=h.hncxag66wqst"
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "link",
+    "si": 755,
+    "ei": 790,
+    "sm": {
+      "lnks_link": {
+        "lnk_type": 0,
+        "ulnk_url": "#heading=h.e8wl8zgubsv6"
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "link",
+    "si": 792,
+    "ei": 833,
+    "sm": {
+      "lnks_link": {
+        "lnk_type": 0,
+        "ulnk_url": "#heading=h.u7bnf8k7248a"
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "link",
+    "si": 835,
+    "ei": 853,
+    "sm": {
+      "lnks_link": {
+        "lnk_type": 0,
+        "ulnk_url": "#heading=h.yy97weqq5x6w"
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "link",
+    "si": 855,
+    "ei": 871,
+    "sm": {
+      "lnks_link": {
+        "lnk_type": 0,
+        "ulnk_url": "#heading=h.1x142i75soja"
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "link",
+    "si": 873,
+    "ei": 882,
+    "sm": {
+      "lnks_link": {
+        "lnk_type": 0,
+        "ulnk_url": "#heading=h.p14lxiov9k9j"
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "link",
+    "si": 884,
+    "ei": 915,
+    "sm": {
+      "lnks_link": {
+        "lnk_type": 0,
+        "ulnk_url": "#heading=h.zh5evy5qih2t"
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "link",
+    "si": 917,
+    "ei": 937,
+    "sm": {
+      "lnks_link": {
+        "lnk_type": 0,
+        "ulnk_url": "#heading=h.ph2tfccvwz9t"
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "link",
+    "si": 939,
+    "ei": 961,
+    "sm": {
+      "lnks_link": {
+        "lnk_type": 0,
+        "ulnk_url": "#heading=h.q114z8xgxu7r"
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "link",
+    "si": 963,
+    "ei": 1005,
+    "sm": {
+      "lnks_link": {
+        "lnk_type": 0,
+        "ulnk_url": "#heading=h.q6yrl6ddipol"
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "link",
+    "si": 1007,
+    "ei": 1027,
+    "sm": {
+      "lnks_link": {
+        "lnk_type": 0,
+        "ulnk_url": "#heading=h.p9vrky4vja19"
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "link",
+    "si": 1029,
+    "ei": 1045,
+    "sm": {
+      "lnks_link": {
+        "lnk_type": 0,
+        "ulnk_url": "#heading=h.tt059jevuou2"
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "link",
+    "si": 1047,
+    "ei": 1058,
+    "sm": {
+      "lnks_link": {
+        "lnk_type": 0,
+        "ulnk_url": "#heading=h.klrza8oryzzu"
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "link",
+    "si": 1214,
+    "ei": 1217,
+    "sm": {
+      "lnks_link": {
+        "lnk_type": 0,
+        "ulnk_url": "https://code.google.com/p/chromium/codesearch#chromium/src/storage/browser/blob/blob_storage_context.cc&l=37&rcl=1418923021"
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "link",
+    "si": 1337,
+    "ei": 1360,
+    "sm": {
+      "lnks_link": {
+        "lnk_type": 0,
+        "ulnk_url": "https://crbug.com/375297"
+      }
+    }
+  }, {
+    "ty": "as",
+    "st": "text",
+    "si": 0,
+    "ei": 4004,
+    "sm": {
+      "ts_un": false,
+      "ts_un_i": true,
+      "ts_sc": false,
+      "ts_st_i": true,
+      "ts_bgc": null,
+      "ts_fs_i": true,
+      "ts_bgc_i": true,
+      "ts_ff_i": true,
+      "ts_bd_i": true,
+      "ts_va_i": true,
+      "ts_fs": 11,
+      "ts_ff": "Arial",
+      "ts_bd": false,
+      "ts_tw": 400,
+      "ts_it_i": true,
+      "ts_fgc": "#000000",
+      "ts_fgc_i": true,
+      "ts_it": false,
+      "ts_va": "nor",
+      "ts_st": false,
+      "ts_sc_i": true
+    }
+  }, {
+    "ty": "as",
+    "st": "text",
+    "si": 0,
+    "ei": 0,
+    "sm": {}
+  }, {
+    "ty": "as",
+    "st": "text",
+    "si": 1,
+    "ei": 132,
+    "sm": {
+      "ts_ff_i": true,
+      "ts_fs": 21,
+      "ts_ff": "Trebuchet MS",
+      "ts_fs_i": true
+    }
+  }, {
+    "ty": "as",
+    "st": "text",
+    "si": 133,
+    "ei": 147,
+    "sm": {
+      "ts_ff_i": true,
+      "ts_un": true,
+      "ts_fgc": "#1155cc",
+      "ts_un_i": false,
+      "ts_fgc_i": false,
+      "ts_fs": 21,
+      "ts_ff": "Trebuchet MS",
+      "ts_fs_i": true
+    }
+  }, {
+    "ty": "as",
+    "st": "text",
+    "si": 148,
+    "ei": 160,
+    "sm": {
+      "ts_ff_i": true,
+      "ts_un": true,
+      "ts_fgc": "#1155cc",
+      "ts_un_i": true,
+      "ts_fgc_i": true,
+      "ts_fs": 21,
+      "ts_ff": "Trebuchet MS",
+      "ts_fs_i": true
+    }
+  }, {
+    "ty": "as",
+    "st": "text",
+    "si": 161,
+    "ei": 186,
+    "sm": {
+      "ts_ff_i": true,
+      "ts_un": true,
+      "ts_fgc": "#1155cc",
+      "ts_un_i": false,
+      "ts_fgc_i": false,
+      "ts_fs": 21,
+      "ts_ff": "Trebuchet MS",
+      "ts_fs_i": true
+    }
+  }, {
+    "ty": "as",
+    "st": "text",
+    "si": 187,
+    "ei": 201,
+    "sm": {
+      "ts_ff_i": true,
+      "ts_un": true,
+      "ts_fgc": "#1155cc",
+      "ts_un_i": true,
+      "ts_fgc_i": true,
+      "ts_fs": 21,
+      "ts_ff": "Trebuchet MS",
+      "ts_fs_i": true
+    }
+  }, {
+    "ty": "as",
+    "st": "text",
+    "si": 202,
+    "ei": 232,
+    "sm": {
+      "ts_ff_i": true,
+      "ts_un": true,
+      "ts_fgc": "#1155cc",
+      "ts_un_i": false,
+      "ts_fgc_i": false,
+      "ts_fs": 21,
+      "ts_ff": "Trebuchet MS",
+      "ts_fs_i": true
+    }
+  }, {
+    "ty": "as",
+    "st": "text",
+    "si": 233,
+    "ei": 261,
+    "sm": {
+      "ts_ff_i": true,
+      "ts_un": true,
+      "ts_fgc": "#1155cc",
+      "ts_un_i": true,
+      "ts_fgc_i": true,
+      "ts_fs": 21,
+      "ts_ff": "Trebuchet MS",
+      "ts_fs_i": true
+    }
+  }, {
+    "ty": "as",
+    "st": "text",
+    "si": 262,
+    "ei": 286,
+    "sm": {
+      "ts_ff_i": true,
+      "ts_un": true,
+      "ts_fgc": "#1155cc",
+      "ts_un_i": false,
+      "ts_fgc_i": false,
+      "ts_fs": 21,
+      "ts_ff": "Trebuchet MS",
+      "ts_fs_i": true
+    }
+  }, {
+    "ty": "as",
+    "st": "text",
+    "si": 287,
+    "ei": 303,
+    "sm": {
+      "ts_ff_i": true,
+      "ts_un": true,
+      "ts_fgc": "#1155cc",
+      "ts_un_i": true,
+      "ts_fgc_i": true,
+      "ts_fs": 21,
+      "ts_ff": "Trebuchet MS",
+      "ts_fs_i": true
+    }
+  }, {
+    "ty": "as",
+    "st": "text",
+    "si": 304,
+    "ei": 322,
+    "sm": {
+      "ts_ff_i": true,
+      "ts_un": true,
+      "ts_fgc": "#1155cc",
+      "ts_un_i": false,
+      "ts_fgc_i": false,
+      "ts_fs": 21,
+      "ts_ff": "Trebuchet MS",
+      "ts_fs_i": true
+    }
+  }, {
+    "ty": "as",
+    "st": "text",
+    "si": 323,
+    "ei": 323,
+    "sm": {
+      "ts_ff_i": true,
+      "ts_un": true,
+      "ts_fgc": "#1155cc",
+      "ts_un_i": true,
+      "ts_fgc_i": true,
+      "ts_fs": 21,
+      "ts_ff": "Trebuchet MS",
+      "ts_fs_i": true
+    }
+  }, {
+    "ty": "as",
+    "st": "text",
+    "si": 324,
+    "ei": 375,
+    "sm": {
+      "ts_un": true,
+      "ts_un_i": true,
+      "ts_fs_i": false,
+      "ts_ff_i": true,
+      "ts_fgc": "#1155cc",
+      "ts_fgc_i": true,
+      "ts_bd_i": false,
+      "ts_fs": 14,
+      "ts_ff": "Trebuchet MS",
+      "ts_bd": true
+    }
+  }, {
+    "ty": "as",
+    "st": "text",
+    "si": 376,
+    "ei": 417,
+    "sm": {
+      "ts_un": true,
+      "ts_un_i": true,
+      "ts_fs_i": false,
+      "ts_ff_i": true,
+      "ts_fgc": "#1155cc",
+      "ts_fgc_i": true,
+      "ts_bd_i": false,
+      "ts_fs": 12,
+      "ts_ff": "Trebuchet MS",
+      "ts_bd": true
+    }
+  }, {
+    "ty": "as",
+    "st": "text",
+    "si": 418,
+    "ei": 439,
+    "sm": {
+      "ts_un": true,
+      "ts_un_i": false,
+      "ts_fs_i": false,
+      "ts_ff_i": true,
+      "ts_fgc": "#1155cc",
+      "ts_fgc_i": false,
+      "ts_bd_i": false,
+      "ts_fs": 12,
+      "ts_ff": "Trebuchet MS",
+      "ts_bd": true
+    }
+  }, {
+    "ty": "as",
+    "st": "text",
+    "si": 440,
+    "ei": 440,
+    "sm": {
+      "ts_ff_i": true,
+      "ts_bd_i": false,
+      "ts_fs": 12,
+      "ts_ff": "Trebuchet MS",
+      "ts_bd": true,
+      "ts_fs_i": false
+    }
+  }, {
+    "ty": "as",
+    "st": "text",
+    "si": 441,
+    "ei": 445,
+    "sm": {
+      "ts_ff_i": true,
+      "ts_fs": 21,
+      "ts_ff": "Trebuchet MS",
+      "ts_fs_i": true
+    }
+  }, {
+    "ty": "as",
+    "st": "text",
+    "si": 446,
+    "ei": 446,
+    "sm": {
+      "ts_fgc": "#000000",
+      "ts_fgc_i": false
+    }
+  }, {
+    "ty": "as",
+    "st": "text",
+    "si": 447,
+    "ei": 1059,
+    "sm": {
+      "ts_un": true,
+      "ts_fgc": "#1155cc",
+      "ts_un_i": false,
+      "ts_fgc_i": false
+    }
+  }, {
+    "ty": "as",
+    "st": "text",
+    "si": 1060,
+    "ei": 1060,
+    "sm": {
+      "ts_fgc": "#000000",
+      "ts_fgc_i": false
+    }
+  }, {
+    "ty": "as",
+    "st": "text",
+    "si": 1061,
+    "ei": 1068,
+    "sm": {
+      "ts_ff_i": true,
+      "ts_fs": 21,
+      "ts_ff": "Trebuchet MS",
+      "ts_fs_i": true
+    }
+  }, {
+    "ty": "as",
+    "st": "text",
+    "si": 1069,
+    "ei": 1069,
+    "sm": {}
+  }, {
+    "ty": "as",
+    "st": "text",
+    "si": 1070,
+    "ei": 1213,
+    "sm": {
+      "ts_ff_i": true,
+      "ts_fs": 21,
+      "ts_ff": "Trebuchet MS",
+      "ts_fs_i": true
+    }
+  }, {
+    "ty": "as",
+    "st": "text",
+    "si": 1214,
+    "ei": 1217,
+    "sm": {
+      "ts_ff_i": true,
+      "ts_un": true,
+      "ts_fgc": "#1155cc",
+      "ts_un_i": false,
+      "ts_fgc_i": false,
+      "ts_fs": 21,
+      "ts_ff": "Trebuchet MS",
+      "ts_fs_i": true
+    }
+  }, {
+    "ty": "as",
+    "st": "text",
+    "si": 1218,
+    "ei": 1336,
+    "sm": {
+      "ts_ff_i": true,
+      "ts_fs": 21,
+      "ts_ff": "Trebuchet MS",
+      "ts_fs_i": true
+    }
+  }, {
+    "ty": "as",
+    "st": "text",
+    "si": 1337,
+    "ei": 1360,
+    "sm": {
+      "ts_ff_i": true,
+      "ts_un": true,
+      "ts_fgc": "#1155cc",
+      "ts_un_i": false,
+      "ts_fgc_i": false,
+      "ts_fs": 21,
+      "ts_ff": "Trebuchet MS",
+      "ts_fs_i": true
+    }
+  }, {
+    "ty": "as",
+    "st": "text",
+    "si": 1361,
+    "ei": 3385,
+    "sm": {
+      "ts_ff_i": true,
+      "ts_fs": 21,
+      "ts_ff": "Trebuchet MS",
+      "ts_fs_i": true
+    }
+  }, {
+    "ty": "as",
+    "st": "text",
+    "si": 3386,
+    "ei": 3426,
+    "sm": {
+      "ts_ff_i": true,
+      "ts_bd_i": false,
+      "ts_fs": 21,
+      "ts_ff": "Trebuchet MS",
+      "ts_bd": true,
+      "ts_fs_i": true
+    }
+  }, {
+    "ty": "as",
+    "st": "text",
+    "si": 3427,
+    "ei": 3548,
+    "sm": {
+      "ts_ff_i": true,
+      "ts_fs": 21,
+      "ts_ff": "Trebuchet MS",
+      "ts_fs_i": true
+    }
+  }, {
+    "ty": "as",
+    "st": "text",
+    "si": 3549,
+    "ei": 3576,
+    "sm": {
+      "ts_ff_i": true,
+      "ts_bd_i": false,
+      "ts_fs": 21,
+      "ts_ff": "Trebuchet MS",
+      "ts_bd": true,
+      "ts_fs_i": true
+    }
+  }, {
+    "ty": "as",
+    "st": "text",
+    "si": 3577,
+    "ei": 3707,
+    "sm": {
+      "ts_ff_i": true,
+      "ts_fs": 21,
+      "ts_ff": "Trebuchet MS",
+      "ts_fs_i": true
+    }
+  }, {
+    "ty": "as",
+    "st": "text",
+    "si": 3708,
+    "ei": 3728,
+    "sm": {
+      "ts_ff_i": true,
+      "ts_bd_i": false,
+      "ts_fs": 21,
+      "ts_ff": "Trebuchet MS",
+      "ts_bd": true,
+      "ts_fs_i": true
+    }
+  }, {
+    "ty": "as",
+    "st": "text",
+    "si": 3729,
+    "ei": 3920,
+    "sm": {
+      "ts_ff_i": true,
+      "ts_fs": 21,
+      "ts_ff": "Trebuchet MS",
+      "ts_fs_i": true
+    }
+  }, {
+    "ty": "as",
+    "st": "text",
+    "si": 3921,
+    "ei": 3933,
+    "sm": {
+      "ts_ff_i": true,
+      "ts_bd_i": false,
+      "ts_fs": 21,
+      "ts_ff": "Trebuchet MS",
+      "ts_bd": true,
+      "ts_fs_i": true
+    }
+  }, {
+    "ty": "as",
+    "st": "text",
+    "si": 3934,
+    "ei": 4004,
+    "sm": {
+      "ts_ff_i": true,
+      "ts_fs": 21,
+      "ts_ff": "Trebuchet MS",
+      "ts_fs_i": true
+    }
+  }]
+};
diff --git a/third_party/WebKit/PerformanceTests/OWPStorage/resources/shared.js b/third_party/WebKit/PerformanceTests/OWPStorage/resources/shared.js
new file mode 100644
index 0000000..3d9073d
--- /dev/null
+++ b/third_party/WebKit/PerformanceTests/OWPStorage/resources/shared.js
@@ -0,0 +1,143 @@
+function deleteThenOpen(dbName, upgradeFunc, bodyFunc) {
+  const deleteRequest = indexedDB.deleteDatabase(dbName);
+  deleteRequest.onerror = PerfTestRunner.logFatalError.bind('deleteDatabase should not fail');
+  deleteRequest.onsuccess = (e) => {
+    const openRequest = indexedDB.open(dbName);
+    openRequest.onupgradeneeded = () => {
+      upgradeFunc(openRequest.result, openRequest);
+    }
+    openRequest.onsuccess = () => {
+      bodyFunc(openRequest.result, openRequest);
+    }
+    openRequest.onerror = (e) => {
+      window.PerfTestRunner.logFatalError("Error setting up database " + dbName + ". Error: " + e.type);
+    }
+  }
+}
+
+// Non-performant on purpose - should cause relayouts.
+function logToDocumentBody(stringOrStrings) {
+  let div = document.createElement("div");
+  document.body.appendChild(div);
+  if (Array.isArray(stringOrStrings)) {
+    for (let string of stringOrStrings) {
+      div.innerHTML += string;
+    }
+  } else {
+    div.innerHTML = stringOrStrings;
+  }
+  return div;
+}
+
+function createIncrementalBarrier(callback) {
+  let count = 0;
+  let called = false;
+  return () => {
+    if (called)
+      PerfTestRunner.logFatalError("Barrier already used.");
+    ++count;
+    return () => {
+      --count;
+      if (count === 0) {
+        if (called)
+          PerfTestRunner.logFatalError("Barrier already used.");
+        called = true;
+        callback();
+      }
+    }
+  }
+}
+
+function transactionCompletePromise(txn) {
+  return new Promise((resolve, reject) => {
+    txn.oncomplete = resolve;
+    txn.onabort = reject;
+  });
+}
+
+function reportDone() {
+  window.parent.postMessage({
+    message: "done"
+  }, "*");
+}
+
+function reportError(event) {
+  console.log(event);
+  window.parent.postMessage({
+    message: "error",
+    data: event
+  }, "*", );
+}
+
+if (window.PerfTestRunner) {
+  // The file loaded here will signal a 'done' or 'error' message (see
+  // reportDone or reportError) which signifies the end of a test run.
+  window.PerfTestRunner.measurePageLoadTimeAfterDoneMessage = function(test) {
+
+    let isDone = false;
+    let outerDone = test.done;
+    test.done = (done) => {
+      isDone = true;
+      if (outerDone)
+        done();
+    }
+
+    test.run = () => {
+      let file = PerfTestRunner.loadFile(test.path);
+
+      let runOnce = function(finishedCallback) {
+        let startTime;
+
+        PerfTestRunner.logInfo("Testing " + file.length + " byte document.");
+
+        let iframe = document.createElement("iframe");
+        test.iframe = iframe;
+        document.body.appendChild(iframe);
+
+        iframe.sandbox = '';
+        // Prevent external loads which could cause write() to return before
+        // completing the parse.
+        iframe.style.width = "600px";
+        // Have a reasonable size so we're not line-breaking on every
+        // character.
+        iframe.style.height = "800px";
+        iframe.contentDocument.open();
+
+        let eventHandler = (event)=>{
+          if (event.data.message == undefined) {
+            console.log("Unknown message: ", event);
+          } else if (event.data.message == "done") {
+            PerfTestRunner.measureValueAsync(PerfTestRunner.now() - startTime);
+            PerfTestRunner.addRunTestEndMarker();
+            document.body.removeChild(test.iframe);
+            finishedCallback();
+          } else if (event.data.message == "error") {
+            console.log("Error in page", event.data.data);
+            PerfTestRunner.logFatalError("error in page: " + event.data.data.type);
+          } else {
+            console.log("Unknown message: ", event);
+          }
+          window.removeEventListener("message", eventHandler);
+        }
+        window.addEventListener("message", eventHandler, false);
+
+        PerfTestRunner.addRunTestStartMarker();
+        startTime = PerfTestRunner.now();
+
+        iframe.contentDocument.write(file);
+        PerfTestRunner.forceLayout(iframe.contentDocument);
+
+        iframe.contentDocument.close();
+      }
+
+      let iterationCallback = () => {
+        if (!isDone)
+          runOnce(iterationCallback);
+      }
+
+      runOnce(iterationCallback);
+    }
+
+    PerfTestRunner.startMeasureValuesAsync(test)
+  }
+}
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8Initializer.cpp b/third_party/WebKit/Source/bindings/core/v8/V8Initializer.cpp
index e73d30701..29bbbaf41 100644
--- a/third_party/WebKit/Source/bindings/core/v8/V8Initializer.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/V8Initializer.cpp
@@ -409,6 +409,38 @@
   void Free(void* data, size_t size) override {
     WTF::ArrayBufferContents::FreeMemory(data);
   }
+
+  void* Reserve(size_t length) override {
+    return WTF::ArrayBufferContents::ReserveMemory(length);
+  }
+
+  void Free(void* data, size_t length, AllocationMode mode) override {
+    switch (mode) {
+      case AllocationMode::kNormal:
+        Free(data, length);
+        return;
+      case AllocationMode::kReservation:
+        WTF::ArrayBufferContents::ReleaseReservedMemory(data, length);
+        return;
+      default:
+        NOTREACHED();
+    }
+  }
+
+  void SetProtection(void* data,
+                     size_t length,
+                     Protection protection) override {
+    switch (protection) {
+      case Protection::kNoAccess:
+        WTF::SetSystemPagesInaccessible(data, length);
+        return;
+      case Protection::kReadWrite:
+        (void)WTF::SetSystemPagesAccessible(data, length);
+        return;
+      default:
+        NOTREACHED();
+    }
+  }
 };
 
 }  // namespace
diff --git a/third_party/WebKit/Source/bindings/templates/interface.cpp.tmpl b/third_party/WebKit/Source/bindings/templates/interface.cpp.tmpl
index 16f28f3..f2c6956f 100644
--- a/third_party/WebKit/Source/bindings/templates/interface.cpp.tmpl
+++ b/third_party/WebKit/Source/bindings/templates/interface.cpp.tmpl
@@ -890,7 +890,23 @@
   // Transfer the ownership of the allocated memory to an {{interface_name}} without
   // copying.
   v8::{{interface_name}}::Contents v8Contents = v8buffer->Externalize();
-  WTF::ArrayBufferContents::DataHandle data(v8Contents.Data(), WTF::ArrayBufferContents::FreeMemory);
+  WTF::ArrayBufferContents::AllocationKind kind = WTF::ArrayBufferContents::AllocationKind::kNormal;
+  switch (v8Contents.AllocationMode()) {
+    case v8::ArrayBuffer::Allocator::AllocationMode::kNormal:
+      kind = WTF::ArrayBufferContents::AllocationKind::kNormal;
+      break;
+    case v8::ArrayBuffer::Allocator::AllocationMode::kReservation:
+      kind = WTF::ArrayBufferContents::AllocationKind::kReservation;
+      break;
+    default:
+      NOTREACHED();
+  };
+  WTF::ArrayBufferContents::DataHandle data(v8Contents.AllocationBase(),
+                                            v8Contents.AllocationLength(),
+                                            v8Contents.Data(),
+                                            v8Contents.ByteLength(),
+                                            kind,
+                                            WTF::ArrayBufferContents::FreeMemory);
   WTF::ArrayBufferContents contents(std::move(data), v8Contents.ByteLength(), WTF::ArrayBufferContents::k{% if interface_name == 'ArrayBuffer' %}Not{% endif %}Shared);
   {{cpp_class}}* buffer = {{cpp_class}}::Create(contents);
   v8::Local<v8::Object> associatedWrapper = buffer->AssociateWithWrapper(v8::Isolate::GetCurrent(), buffer->GetWrapperTypeInfo(), object);
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8ArrayBuffer.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8ArrayBuffer.cpp
index 85ebae9..c72311bb 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8ArrayBuffer.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8ArrayBuffer.cpp
@@ -78,7 +78,23 @@
   // Transfer the ownership of the allocated memory to an ArrayBuffer without
   // copying.
   v8::ArrayBuffer::Contents v8Contents = v8buffer->Externalize();
-  WTF::ArrayBufferContents::DataHandle data(v8Contents.Data(), WTF::ArrayBufferContents::FreeMemory);
+  WTF::ArrayBufferContents::AllocationKind kind = WTF::ArrayBufferContents::AllocationKind::kNormal;
+  switch (v8Contents.AllocationMode()) {
+    case v8::ArrayBuffer::Allocator::AllocationMode::kNormal:
+      kind = WTF::ArrayBufferContents::AllocationKind::kNormal;
+      break;
+    case v8::ArrayBuffer::Allocator::AllocationMode::kReservation:
+      kind = WTF::ArrayBufferContents::AllocationKind::kReservation;
+      break;
+    default:
+      NOTREACHED();
+  };
+  WTF::ArrayBufferContents::DataHandle data(v8Contents.AllocationBase(),
+                                            v8Contents.AllocationLength(),
+                                            v8Contents.Data(),
+                                            v8Contents.ByteLength(),
+                                            kind,
+                                            WTF::ArrayBufferContents::FreeMemory);
   WTF::ArrayBufferContents contents(std::move(data), v8Contents.ByteLength(), WTF::ArrayBufferContents::kNotShared);
   TestArrayBuffer* buffer = TestArrayBuffer::Create(contents);
   v8::Local<v8::Object> associatedWrapper = buffer->AssociateWithWrapper(v8::Isolate::GetCurrent(), buffer->GetWrapperTypeInfo(), object);
diff --git a/third_party/WebKit/Source/build/scripts/make_css_value_id_mappings.py b/third_party/WebKit/Source/build/scripts/make_css_value_id_mappings.py
index 33498bd..a196dc1 100755
--- a/third_party/WebKit/Source/build/scripts/make_css_value_id_mappings.py
+++ b/third_party/WebKit/Source/build/scripts/make_css_value_id_mappings.py
@@ -10,25 +10,128 @@
 from name_utilities import enum_for_css_keyword, enum_value_name
 
 
+def _find_continuous_segment(numbers):
+    """Find the longest continuous segment in a list of numbers.
+    For example:
+        input:
+                1, 2, 3, 4, 5, 6
+               22,70,23,24,25,26
+        output:
+            number_list_sorted:
+                1, 3, 4, 5, 6, 2
+               22,23,24,25,26,70
+            segments:
+                0, 1, 5, 6
+            which means there are 3 segment with start and end indices
+            on the number_list_sorted to be: (0, 1), (1, 5), (5, 6)
+
+    Args:
+        numbers: List of pairs of number
+
+    Returns:
+        segment: a list containing the indices of the segment start point
+            and end point.
+        number_list: sorted by the first element version of the input.
+
+    """
+    segments = [0]
+    number_list_sorted = sorted(numbers, key=lambda elem: elem[0])
+    for i in range(len(number_list_sorted) - 1):
+        # continuous segment is a segment which the number in pair is 1 unit
+        # more than the previous pair
+        if (number_list_sorted[i + 1][0] - number_list_sorted[i][0] != 1
+                or number_list_sorted[i + 1][1] - number_list_sorted[i][1] != 1):
+            segments.append(i + 1)
+    segments.append(len(number_list_sorted))
+    return segments, number_list_sorted
+
+
+def _find_largest_segment(segments):
+    """Find the largest segment given a list of start and end
+    indices of segments
+
+    Args:
+        segments: a list of start and end indices
+
+    Returns:
+        longest_segment: the start and end indices of the longest segment
+
+    """
+    segment_list = zip(segments[:-1], segments[1:])
+    return max(segment_list, key=lambda x: x[1] - x[0])
+
+
+def _find_enum_longest_continuous_segment(property_, name_to_position_dictionary):
+    """Find the longest continuous segment in the list of keywords
+    Finding the continuous segment will allows us to do the subtraction
+    between keywords so that the distance between 2 keywords in this
+    enum is equal to the distance of corresponding keywords in another
+    enum.
+
+    Step 1:
+        Convert keyword enums into number.
+        Sort and find all continuous segment in the list of enums.
+
+    Step 2:
+        Get the longest segment.
+
+    Step 3:
+        Compose a list of keyword enums and their respective numbers
+        in the sorted order.
+
+    Step 4:
+        Build the switch case statements of other enums not in the
+        segment. Enums in the segment will be computed in default clause.
+    """
+    property_enum_order = range(len(property_['keywords']))
+    css_enum_order = [name_to_position_dictionary[x] for x in property_['keywords']]
+    enum_pair_list = zip(css_enum_order, property_enum_order)
+    enum_segment, enum_pair_list = _find_continuous_segment(enum_pair_list)
+    longest_segment = _find_largest_segment(enum_segment)
+
+    enum_pair_list = [
+        (enum_value_name(property_['keywords'][x[1]]), x[1],
+         enum_for_css_keyword(property_['keywords'][x[1]]), x[0]) for x in enum_pair_list
+    ]
+    return enum_pair_list, enum_segment, longest_segment
+
+
 class CSSValueIDMappingsWriter(make_style_builder.StyleBuilderWriter):
     def __init__(self, json5_file_path):
-        super(CSSValueIDMappingsWriter, self).__init__(json5_file_path)
+        super(CSSValueIDMappingsWriter, self).__init__([json5_file_path[0]])
         self._outputs = {
             'CSSValueIDMappingsGenerated.h': self.generate_css_value_mappings,
         }
+        self.css_values_dictionary_file = json5_file_path[1]
 
     @template_expander.use_jinja('templates/CSSValueIDMappingsGenerated.h.tmpl')
     def generate_css_value_mappings(self):
         mappings = {}
         include_paths = set()
-        for property_ in self._properties.values():
-            if property_['field_template'] in ('keyword', 'multi_keyword'):
-                include_paths.update(property_['include_paths'])
+        css_values_dictionary = json5_generator.Json5File.load_from_files(
+            [self.css_values_dictionary_file],
+            default_parameters=self.json5_file.parameters
+        ).name_dictionaries
+        name_to_position_dictionary = dict(zip([x['name'] for x in css_values_dictionary], range(len(css_values_dictionary))))
 
+        for property_ in self._properties.values():
+            include_paths.update(property_['include_paths'])
+            if property_['field_template'] == 'multi_keyword':
                 mappings[property_['type_name']] = {
                     'default_value': enum_value_name(property_['default_value']),
                     'mapping': [(enum_value_name(k), enum_for_css_keyword(k)) for k in property_['keywords']],
                 }
+            elif property_['field_template'] == 'keyword':
+                enum_pair_list, enum_segment, p_segment = _find_enum_longest_continuous_segment(
+                    property_, name_to_position_dictionary)
+                mappings[property_['type_name']] = {
+                    'default_value': enum_value_name(property_['default_value']),
+                    'mapping': enum_pair_list,
+                    'segment': enum_segment,
+                    'longest_segment_length': p_segment[1] - p_segment[0],
+                    'start_segment': enum_pair_list[p_segment[0]],
+                    'end_segment': enum_pair_list[p_segment[1] - 1],
+                }
 
         return {
             'include_paths': list(sorted(include_paths)),
diff --git a/third_party/WebKit/Source/build/scripts/templates/CSSValueIDMappingsGenerated.h.tmpl b/third_party/WebKit/Source/build/scripts/templates/CSSValueIDMappingsGenerated.h.tmpl
index a99805f3..db77907 100644
--- a/third_party/WebKit/Source/build/scripts/templates/CSSValueIDMappingsGenerated.h.tmpl
+++ b/third_party/WebKit/Source/build/scripts/templates/CSSValueIDMappingsGenerated.h.tmpl
@@ -27,6 +27,7 @@
 T cssValueIDToPlatformEnumGenerated(CSSValueID);
 
 {% for enum_name, mapping in mappings.items() %}
+{% if 'segment' not in mapping %}
 template <>
 inline {{enum_name}} cssValueIDToPlatformEnumGenerated(CSSValueID v) {
   switch (v) {
@@ -51,7 +52,41 @@
       return CSSValueNone;
   }
 }
+{% else %}
 
+template <>
+inline {{enum_name}} cssValueIDToPlatformEnumGenerated(CSSValueID v) {
+  {% if mapping['mapping'] | length > mapping.longest_segment_length %}
+  switch (v) {
+  {% for cs_value, cs_num, css_value, css_num in mapping['mapping']: %}
+  {% if css_num < mapping.start_segment[3] or css_num > mapping.end_segment[3] %}
+    case {{css_value}}:
+      return {{enum_name}}::{{cs_value}};
+  {% endif %}
+  {% endfor %}
+    default:
+      DCHECK(v >= {{mapping.start_segment[2]}} && v <= {{mapping.end_segment[2]}}) ;
+      return static_cast<{{enum_name}}>(v - {{mapping.start_segment[2]}} + static_cast<int>({{enum_name}}::{{mapping.start_segment[0]}}));
+  }
+  {% else %}
+  DCHECK(v >= {{mapping.start_segment[2]}} && v <= {{mapping.end_segment[2]}}) ;
+  return static_cast<{{enum_name}}>(v - {{mapping.start_segment[2]}} + static_cast<int>({{enum_name}}::{{mapping.start_segment[0]}}));
+  {% endif %}
+}
+
+inline CSSValueID platformEnumToCSSValueIDGenerated({{enum_name}} v) {
+  switch (v) {
+  {% for cs_value, cs_num, css_value, css_num in mapping['mapping']: %}
+    case {{enum_name}}::{{cs_value}}:
+      return {{css_value}};
+  {% endfor %}
+    default:
+      NOTREACHED();
+      return CSSValueNone;
+  }
+}
+
+{% endif %}
 {% endfor %}
 } // namespace detail
 
diff --git a/third_party/WebKit/Source/build/scripts/templates/MakeNames.cpp.tmpl b/third_party/WebKit/Source/build/scripts/templates/MakeNames.cpp.tmpl
index ada18abd..0d3701c 100644
--- a/third_party/WebKit/Source/build/scripts/templates/MakeNames.cpp.tmpl
+++ b/third_party/WebKit/Source/build/scripts/templates/MakeNames.cpp.tmpl
@@ -19,6 +19,10 @@
 {% endfor %}
 
 void init{{suffix}}() {
+  static bool isLoaded = false;
+  if (isLoaded) return;
+  isLoaded = true;
+
   struct NameEntry {
     const char* name;
     unsigned hash;
diff --git a/third_party/WebKit/Source/core/BUILD.gn b/third_party/WebKit/Source/core/BUILD.gn
index 34077cf..2d2cf84 100644
--- a/third_party/WebKit/Source/core/BUILD.gn
+++ b/third_party/WebKit/Source/core/BUILD.gn
@@ -442,8 +442,12 @@
 
 css_properties("make_core_generated_css_value_id_mappings") {
   script = "../build/scripts/make_css_value_id_mappings.py"
-  other_inputs =
-      [ "../build/scripts/templates/CSSValueIDMappingsGenerated.h.tmpl" ]
+  in_files = [
+        "css/CSSValueKeywords.json5"
+  ]
+  other_inputs = [
+        "../build/scripts/templates/CSSValueIDMappingsGenerated.h.tmpl",
+  ]
   outputs = [
     "$blink_core_output_dir/CSSValueIDMappingsGenerated.h",
   ]
diff --git a/third_party/WebKit/Source/core/dom/Document.cpp b/third_party/WebKit/Source/core/dom/Document.cpp
index 75a4920..4da40da 100644
--- a/third_party/WebKit/Source/core/dom/Document.cpp
+++ b/third_party/WebKit/Source/core/dom/Document.cpp
@@ -2646,7 +2646,7 @@
   MutationObserver::CleanSlotChangeList(*this);
 
   hover_element_ = nullptr;
-  active_hover_element_ = nullptr;
+  active_element_ = nullptr;
   autofocus_element_ = nullptr;
 
   if (focused_element_.Get()) {
@@ -4203,13 +4203,13 @@
   hover_element_ = new_hover_element;
 }
 
-void Document::SetActiveHoverElement(Element* new_active_element) {
+void Document::SetActiveElement(Element* new_active_element) {
   if (!new_active_element) {
-    active_hover_element_.Clear();
+    active_element_.Clear();
     return;
   }
 
-  active_hover_element_ = new_active_element;
+  active_element_ = new_active_element;
 }
 
 void Document::RemoveFocusedElementOfSubtree(Node* node,
@@ -4254,8 +4254,8 @@
 }
 
 void Document::ActiveChainNodeDetached(Element& element) {
-  if (element == active_hover_element_)
-    active_hover_element_ = SkipDisplayNoneAncestors(&element);
+  if (element == active_element_)
+    active_element_ = SkipDisplayNoneAncestors(&element);
 }
 
 const Vector<AnnotatedRegionValue>& Document::AnnotatedRegions() const {
@@ -6487,7 +6487,14 @@
   }
 
   UpdateDistribution();
-  Element* old_active_element = ActiveHoverElement();
+
+  UpdateActiveState(request, inner_element_in_document);
+  UpdateHoverState(request, inner_element_in_document);
+}
+
+void Document::UpdateActiveState(const HitTestRequest& request,
+                                 Element* inner_element_in_document) {
+  Element* old_active_element = GetActiveElement();
   if (old_active_element && !request.Active()) {
     // The oldActiveElement layoutObject is null, dropped on :active by setting
     // display: none, for instance. We still need to clear the ActiveChain as
@@ -6497,7 +6504,7 @@
       element->SetActive(false);
       user_action_elements_.SetInActiveChain(element, false);
     }
-    SetActiveHoverElement(nullptr);
+    SetActiveElement(nullptr);
   } else {
     Element* new_active_element = inner_element_in_document;
     if (!old_active_element && new_active_element &&
@@ -6509,24 +6516,39 @@
            element = FlatTreeTraversal::ParentElement(*element)) {
         user_action_elements_.SetInActiveChain(element, true);
       }
-      SetActiveHoverElement(new_active_element);
+      SetActiveElement(new_active_element);
     }
   }
 
+  // If the mouse has just been pressed, set :active on the chain. Those (and
+  // only those) nodes should remain :active until the mouse is released.
+  bool allow_active_changes = !old_active_element && GetActiveElement();
+  if (!allow_active_changes)
+    return;
+
+  // If the mouse is down and if this is a mouse move event, we want to restrict
+  // changes in :active to only apply to elements that are in the :active
+  // chain that we froze at the time the mouse went down.
+  bool must_be_in_active_chain = request.Active() && request.Move();
+
+  Element* new_element =
+      SkipDisplayNoneAncestors(inner_element_in_document);
+
+  // Now set the active state for our new object up to the root.
+  for (Element* curr = new_element; curr;
+       curr = FlatTreeTraversal::ParentElement(*curr)) {
+    if (!must_be_in_active_chain || curr->InActiveChain())
+      curr->SetActive(true);
+  }
+}
+
+void Document::UpdateHoverState(const HitTestRequest& request,
+                                Element* inner_element_in_document) {
   // Do not set hover state if event is from touch and on mobile.
   bool allow_hover_changes =
       !(request.TouchEvent() && GetPage() &&
         GetPage()->GetVisualViewport().ShouldDisableDesktopWorkarounds());
 
-  // If the mouse has just been pressed, set :active on the chain. Those (and
-  // only those) nodes should remain :active until the mouse is released.
-  bool allow_active_changes = !old_active_element && ActiveHoverElement();
-
-  // If the mouse is down and if this is a mouse move event, we want to restrict
-  // changes in :hover/:active to only apply to elements that are in the :active
-  // chain that we froze at the time the mouse went down.
-  bool must_be_in_active_chain = request.Active() && request.Move();
-
   Element* old_hover_element = HoverElement();
 
   // The passed in innerElement may not be a result of a hit test for the
@@ -6540,6 +6562,9 @@
   if (allow_hover_changes)
     SetHoverElement(new_hover_element);
 
+  if (old_hover_element == new_hover_element || !allow_hover_changes)
+    return;
+
   Node* ancestor_element = nullptr;
   if (old_hover_element && old_hover_element->isConnected() &&
       new_hover_element) {
@@ -6550,50 +6575,34 @@
   }
 
   HeapVector<Member<Element>, 32> elements_to_remove_from_chain;
-  HeapVector<Member<Element>, 32> elements_to_add_to_chain;
+  HeapVector<Member<Element>, 32> elements_to_add_to_hover_chain;
 
-  if (old_hover_element != new_hover_element) {
-    // The old hover path only needs to be cleared up to (and not including) the
-    // common ancestor;
-    //
-    // FIXME(ecobos@igalia.com): oldHoverElement may be disconnected from the
-    // tree already. This is due to our handling of m_hoverElement in
-    // hoveredElementDetached (which assumes all the parents are hovered) and
-    // mustBeInActiveChain (which makes this not hold).
-    //
-    // In that case, none of the nodes in the chain have the flags, so there's
-    // no problem in skipping this step.
-    if (old_hover_element && old_hover_element->isConnected()) {
-      for (Element* curr = old_hover_element; curr && curr != ancestor_element;
-           curr = FlatTreeTraversal::ParentElement(*curr)) {
-        if (!must_be_in_active_chain || curr->InActiveChain())
-          elements_to_remove_from_chain.push_back(curr);
-      }
+  // The old hover path only needs to be cleared up to (and not including) the
+  // common ancestor;
+  //
+  // FIXME(ecobos@igalia.com): oldHoverElement may be disconnected from the
+  // tree already.
+  if (old_hover_element && old_hover_element->isConnected()) {
+    for (Element* curr = old_hover_element; curr && curr != ancestor_element;
+         curr = FlatTreeTraversal::ParentElement(*curr)) {
+      elements_to_remove_from_chain.push_back(curr);
     }
   }
 
   // Now set the hover state for our new object up to the root.
   for (Element* curr = new_hover_element; curr;
        curr = FlatTreeTraversal::ParentElement(*curr)) {
-    if (!must_be_in_active_chain || curr->InActiveChain())
-      elements_to_add_to_chain.push_back(curr);
+    elements_to_add_to_hover_chain.push_back(curr);
   }
 
-  if (allow_hover_changes) {
-    for (Element* element : elements_to_remove_from_chain)
-      element->SetHovered(false);
-  }
+  for (Element* element : elements_to_remove_from_chain)
+    element->SetHovered(false);
 
   bool saw_common_ancestor = false;
-  for (Element* element : elements_to_add_to_chain) {
-    // Elements past the common ancestor do not change hover state, but might
-    // change active state.
+  for (Element* element : elements_to_add_to_hover_chain) {
     if (element == ancestor_element)
       saw_common_ancestor = true;
-    if (allow_active_changes)
-      element->SetActive(true);
-    if (allow_hover_changes &&
-        (!saw_common_ancestor || element == hover_element_))
+    if (!saw_common_ancestor || element == hover_element_)
       element->SetHovered(true);
   }
 }
@@ -6855,7 +6864,7 @@
   visitor->Trace(focused_element_);
   visitor->Trace(sequential_focus_navigation_starting_point_);
   visitor->Trace(hover_element_);
-  visitor->Trace(active_hover_element_);
+  visitor->Trace(active_element_);
   visitor->Trace(document_element_);
   visitor->Trace(root_scroller_controller_);
   visitor->Trace(title_element_);
diff --git a/third_party/WebKit/Source/core/dom/Document.h b/third_party/WebKit/Source/core/dom/Document.h
index bb06568..99baff5 100644
--- a/third_party/WebKit/Source/core/dom/Document.h
+++ b/third_party/WebKit/Source/core/dom/Document.h
@@ -727,8 +727,8 @@
   void SetSequentialFocusNavigationStartingPoint(Node*);
   Element* SequentialFocusNavigationStartingPoint(WebFocusType) const;
 
-  void SetActiveHoverElement(Element*);
-  Element* ActiveHoverElement() const { return active_hover_element_.Get(); }
+  void SetActiveElement(Element*);
+  Element* GetActiveElement() const { return active_element_.Get(); }
 
   Element* HoverElement() const { return hover_element_.Get(); }
 
@@ -1447,6 +1447,9 @@
   bool HaveImportsLoaded() const;
   void ViewportDefiningElementDidChange();
 
+  void UpdateActiveState(const HitTestRequest&, Element*);
+  void UpdateHoverState(const HitTestRequest&, Element*);
+
   DocumentLifecycle lifecycle_;
 
   bool has_nodes_with_placeholder_style_;
@@ -1502,7 +1505,7 @@
   Member<Element> focused_element_;
   Member<Range> sequential_focus_navigation_starting_point_;
   Member<Element> hover_element_;
-  Member<Element> active_hover_element_;
+  Member<Element> active_element_;
   Member<Element> document_element_;
   UserActionElementSet user_action_elements_;
   Member<RootScrollerController> root_scroller_controller_;
diff --git a/third_party/WebKit/Source/core/input/GestureManager.cpp b/third_party/WebKit/Source/core/input/GestureManager.cpp
index 3a8a26ac..4cde4a6 100644
--- a/third_party/WebKit/Source/core/input/GestureManager.cpp
+++ b/third_party/WebKit/Source/core/input/GestureManager.cpp
@@ -57,7 +57,7 @@
     case WebInputEvent::kGestureTapCancel:
       // A TapDownCancel received when no element is active shouldn't really be
       // changing hover state.
-      if (!frame_->GetDocument()->ActiveHoverElement())
+      if (!frame_->GetDocument()->GetActiveElement())
         hit_type |= HitTestRequest::kReadOnly;
       return hit_type | HitTestRequest::kRelease;
     case WebInputEvent::kGestureTap:
diff --git a/third_party/WebKit/Source/core/inspector/InspectorDOMSnapshotAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorDOMSnapshotAgent.cpp
index 4395577..9a1cfd48 100644
--- a/third_party/WebKit/Source/core/inspector/InspectorDOMSnapshotAgent.cpp
+++ b/third_party/WebKit/Source/core/inspector/InspectorDOMSnapshotAgent.cpp
@@ -4,6 +4,7 @@
 
 #include "core/inspector/InspectorDOMSnapshotAgent.h"
 
+#include "core/InputTypeNames.h"
 #include "core/css/CSSComputedStyleDeclaration.h"
 #include "core/dom/Attribute.h"
 #include "core/dom/AttributeCollection.h"
@@ -16,8 +17,11 @@
 #include "core/dom/QualifiedName.h"
 #include "core/frame/LocalFrame.h"
 #include "core/html/HTMLFrameOwnerElement.h"
+#include "core/html/HTMLInputElement.h"
 #include "core/html/HTMLLinkElement.h"
+#include "core/html/HTMLOptionElement.h"
 #include "core/html/HTMLTemplateElement.h"
+#include "core/html/HTMLTextAreaElement.h"
 #include "core/inspector/IdentifiersFactory.h"
 #include "core/inspector/InspectedFrames.h"
 #include "core/inspector/InspectorDOMAgent.h"
@@ -174,7 +178,7 @@
     value->setAttributes(BuildArrayForElementAttributes(element));
 
     if (node->IsFrameOwnerElement()) {
-      HTMLFrameOwnerElement* frame_owner = ToHTMLFrameOwnerElement(node);
+      const HTMLFrameOwnerElement* frame_owner = ToHTMLFrameOwnerElement(node);
       if (LocalFrame* frame =
               frame_owner->ContentFrame() &&
                       frame_owner->ContentFrame()->IsLocalFrame()
@@ -194,7 +198,7 @@
     }
 
     if (isHTMLLinkElement(*element)) {
-      HTMLLinkElement& link_element = toHTMLLinkElement(*element);
+      const HTMLLinkElement& link_element = toHTMLLinkElement(*element);
       if (link_element.IsImport() && link_element.import() &&
           InspectorDOMAgent::InnerParentNode(link_element.import()) ==
               link_element) {
@@ -207,6 +211,26 @@
           VisitNode(toHTMLTemplateElement(*element).content()));
     }
 
+    if (isHTMLTextAreaElement(*element)) {
+      const HTMLTextAreaElement& text_area_element =
+          toHTMLTextAreaElement(*element);
+      value->setTextValue(text_area_element.value());
+    }
+
+    if (isHTMLInputElement(*element)) {
+      const HTMLInputElement& input_element = toHTMLInputElement(*element);
+      value->setInputValue(input_element.value());
+      if ((input_element.type() == InputTypeNames::radio) ||
+          (input_element.type() == InputTypeNames::checkbox)) {
+        value->setInputChecked(input_element.checked());
+      }
+    }
+
+    if (isHTMLOptionElement(*element)) {
+      const HTMLOptionElement& option_element = toHTMLOptionElement(*element);
+      value->setOptionSelected(option_element.Selected());
+    }
+
     if (element->GetPseudoId()) {
       protocol::DOM::PseudoType pseudo_type;
       if (InspectorDOMAgent::GetPseudoElementType(element->GetPseudoId(),
diff --git a/third_party/WebKit/Source/core/inspector/browser_protocol.json b/third_party/WebKit/Source/core/inspector/browser_protocol.json
index e73bc467..8732e5e 100644
--- a/third_party/WebKit/Source/core/inspector/browser_protocol.json
+++ b/third_party/WebKit/Source/core/inspector/browser_protocol.json
@@ -3381,6 +3381,10 @@
                     { "name": "nodeType", "type": "integer", "description": "<code>Node</code>'s nodeType." },
                     { "name": "nodeName", "type": "string", "description": "<code>Node</code>'s nodeName." },
                     { "name": "nodeValue", "type": "string", "description": "<code>Node</code>'s nodeValue." },
+                    { "name": "textValue", "type": "string", "optional": true, "description": "Only set for textarea elements, contains the text value." },
+                    { "name": "inputValue", "type": "string", "optional": true, "description": "Only set for input elements, contains the input's associated text value." },
+                    { "name": "inputChecked", "type": "boolean", "optional": true, "description": "Only set for radio and checkbox input elements, indicates if the element has been checked" },
+                    { "name": "optionSelected", "type": "boolean", "optional": true, "description": "Only set for option elements, indicates if the element has been selected" },
                     { "name": "backendNodeId", "$ref": "DOM.BackendNodeId", "description": "<code>Node</code>'s id, corresponds to DOM.Node.backendNodeId." },
                     { "name": "childNodeIndexes", "type": "array", "items": { "type": "integer" }, "optional": true, "description": "The indexes of the node's child nodes in the <code>domNodes</code> array returned by <code>getSnapshot</code>, if any." },
                     { "name": "attributes", "type": "array", "items": { "$ref": "NameValue" }, "optional": true, "description": "Attributes of an <code>Element</code> node." },
diff --git a/third_party/WebKit/Source/core/layout/LayoutBlockFlowLine.cpp b/third_party/WebKit/Source/core/layout/LayoutBlockFlowLine.cpp
index c25fa47d..694df3c 100644
--- a/third_party/WebKit/Source/core/layout/LayoutBlockFlowLine.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutBlockFlowLine.cpp
@@ -2451,13 +2451,12 @@
   ETextAlign text_align = Style()->GetTextAlign();
   IndentTextOrNot indent_text = kIndentText;
   for (RootInlineBox* curr = FirstRootBox(); curr; curr = curr->NextRootBox()) {
-    LayoutUnit curr_logical_left = curr->LogicalLeft();
     LayoutUnit block_right_edge =
         LogicalRightOffsetForLine(curr->LineTop(), indent_text);
     LayoutUnit block_left_edge =
         LogicalLeftOffsetForLine(curr->LineTop(), indent_text);
-    LayoutUnit line_box_edge =
-        ltr ? curr_logical_left + curr->LogicalWidth() : curr_logical_left;
+    LayoutUnit line_box_edge = ltr ? curr->LogicalRightLayoutOverflow()
+                                   : curr->LogicalLeftLayoutOverflow();
     if ((ltr && line_box_edge > block_right_edge) ||
         (!ltr && line_box_edge < block_left_edge)) {
       // This line spills out of our box in the appropriate direction. Now we
diff --git a/third_party/WebKit/Source/core/layout/LayoutDeprecatedFlexibleBox.cpp b/third_party/WebKit/Source/core/layout/LayoutDeprecatedFlexibleBox.cpp
index 34d3fd84..ef186623 100644
--- a/third_party/WebKit/Source/core/layout/LayoutDeprecatedFlexibleBox.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutDeprecatedFlexibleBox.cpp
@@ -1197,7 +1197,7 @@
         last_visible_line->Y(), kDoNotIndentText);
     last_visible_line->PlaceEllipsis(
         ellipsis_str, left_to_right, block_left_edge, block_right_edge,
-        LayoutUnit(total_width), LayoutUnit(), false);
+        LayoutUnit(total_width), LayoutUnit(), false, ForceEllipsis);
     dest_block.SetHasMarkupTruncation(true);
   }
 }
diff --git a/third_party/WebKit/Source/core/layout/line/InlineFlowBox.cpp b/third_party/WebKit/Source/core/layout/line/InlineFlowBox.cpp
index f78f76f..ff6f1f4 100644
--- a/third_party/WebKit/Source/core/layout/line/InlineFlowBox.cpp
+++ b/third_party/WebKit/Source/core/layout/line/InlineFlowBox.cpp
@@ -1202,9 +1202,9 @@
   // invalidations for ourselves. Self-painting layers are ignored.
   // Layout overflow is used to determine scrolling extent, so it still includes
   // child layers and also factors in transforms, relative positioning, etc.
-  LayoutRect logical_layout_overflow(
+  LayoutRect logical_layout_overflow;
+  LayoutRect logical_visual_overflow(
       LogicalFrameRectIncludingLineHeight(line_top, line_bottom));
-  LayoutRect logical_visual_overflow(logical_layout_overflow);
 
   AddBoxShadowVisualOverflow(logical_visual_overflow);
   AddBorderOutsetVisualOverflow(logical_visual_overflow);
@@ -1465,6 +1465,9 @@
   // If our flow is ltr then iterate over the boxes from left to right,
   // otherwise iterate from right to left. Varying the order allows us to
   // correctly hide the boxes following the ellipsis.
+  LayoutUnit relative_offset =
+      BoxModelObject().RelativePositionLogicalOffset().Width();
+  logical_left_offset += relative_offset;
   InlineBox* box = ltr ? FirstChild() : LastChild();
 
   // NOTE: these will cross after foundBox = true.
@@ -1491,7 +1494,7 @@
       box = box->PrevOnLine();
     }
   }
-  return result;
+  return result + relative_offset;
 }
 
 void InlineFlowBox::ClearTruncation() {
diff --git a/third_party/WebKit/Source/core/layout/line/InlineFlowBox.h b/third_party/WebKit/Source/core/layout/line/InlineFlowBox.h
index ab20f32..538e948 100644
--- a/third_party/WebKit/Source/core/layout/line/InlineFlowBox.h
+++ b/third_party/WebKit/Source/core/layout/line/InlineFlowBox.h
@@ -308,6 +308,20 @@
       result = result.TransposedRect();
     return result;
   }
+  LayoutUnit LogicalRightLayoutOverflow() const {
+    if (overflow_) {
+      return IsHorizontal() ? overflow_->LayoutOverflowRect().MaxX()
+                            : overflow_->LayoutOverflowRect().MaxY();
+    }
+    return LogicalRight();
+  }
+  LayoutUnit LogicalLeftLayoutOverflow() const {
+    if (overflow_) {
+      return IsHorizontal() ? overflow_->LayoutOverflowRect().X()
+                            : overflow_->LayoutOverflowRect().Y();
+    }
+    return LogicalLeft();
+  }
 
   LayoutRect VisualOverflowRect(LayoutUnit line_top,
                                 LayoutUnit line_bottom) const {
diff --git a/third_party/WebKit/Source/core/layout/line/RootInlineBox.cpp b/third_party/WebKit/Source/core/layout/line/RootInlineBox.cpp
index 82295b7..a15fd885 100644
--- a/third_party/WebKit/Source/core/layout/line/RootInlineBox.cpp
+++ b/third_party/WebKit/Source/core/layout/line/RootInlineBox.cpp
@@ -114,10 +114,10 @@
                                         LayoutUnit block_right_edge,
                                         LayoutUnit ellipsis_width,
                                         LayoutUnit logical_left_offset,
-                                        bool found_box) {
+                                        bool found_box,
+                                        ForceEllipsisOnLine force_ellipsis) {
   // Create an ellipsis box if we don't already have one. If we already have one
-  // we're just
-  // here to blank out (truncate) the text boxes.
+  // we're just here to blank out (truncate) the text boxes.
   if (!found_box) {
     EllipsisBox* ellipsis_box = new EllipsisBox(
         GetLineLayoutItem(), ellipsis_str, this, ellipsis_width,
@@ -131,8 +131,9 @@
 
   // FIXME: Do we need an RTL version of this?
   LayoutUnit adjusted_logical_left = logical_left_offset + LogicalLeft();
-  if (ltr && (adjusted_logical_left + LogicalWidth() + ellipsis_width) <=
-                 block_right_edge) {
+  if (force_ellipsis == ForceEllipsis && ltr &&
+      (adjusted_logical_left + LogicalWidth() + ellipsis_width) <=
+          block_right_edge) {
     if (HasEllipsisBox())
       GetEllipsisBox()->SetLogicalLeft(LogicalLeft() + LogicalWidth());
     return LogicalWidth() + ellipsis_width;
diff --git a/third_party/WebKit/Source/core/layout/line/RootInlineBox.h b/third_party/WebKit/Source/core/layout/line/RootInlineBox.h
index 1d5c5ce42..501ed63 100644
--- a/third_party/WebKit/Source/core/layout/line/RootInlineBox.h
+++ b/third_party/WebKit/Source/core/layout/line/RootInlineBox.h
@@ -36,6 +36,8 @@
 
 struct BidiStatus;
 
+enum ForceEllipsisOnLine { DoNotForceEllipsis, ForceEllipsis };
+
 class RootInlineBox : public InlineFlowBox {
  public:
   explicit RootInlineBox(LineLayoutItem);
@@ -114,7 +116,8 @@
                            LayoutUnit block_right_edge,
                            LayoutUnit ellipsis_width,
                            LayoutUnit logical_left_offset,
-                           bool found_box);
+                           bool found_box,
+                           ForceEllipsisOnLine = DoNotForceEllipsis);
   // Return the position of the EllipsisBox or -1.
   LayoutUnit PlaceEllipsisBox(bool ltr,
                               LayoutUnit block_left_edge,
diff --git a/third_party/WebKit/Source/core/paint/BoxPainter.cpp b/third_party/WebKit/Source/core/paint/BoxPainter.cpp
index 14d84d2..b22a424 100644
--- a/third_party/WebKit/Source/core/paint/BoxPainter.cpp
+++ b/third_party/WebKit/Source/core/paint/BoxPainter.cpp
@@ -247,60 +247,37 @@
 
 namespace {
 
-class ImagePaintContext {
+class InterpolationQualityContext {
  public:
-  ImagePaintContext(const ImageResourceObserver& image_client,
-                    const Document& document,
-                    const ComputedStyle& style,
-                    GraphicsContext& context,
-                    const FillLayer& layer,
-                    const StyleImage& style_image,
-                    SkBlendMode op,
-                    const LayoutSize& container_size)
+  InterpolationQualityContext(const ComputedStyle& style,
+                              GraphicsContext& context)
       : context_(context),
         previous_interpolation_quality_(context.ImageInterpolationQuality()) {
-    SkBlendMode bg_op =
-        WebCoreCompositeToSkiaComposite(layer.Composite(), layer.BlendMode());
-    // if op != SkBlendMode::kSrcOver, a mask is being painted.
-    composite_op_ = (op == SkBlendMode::kSrcOver) ? bg_op : op;
-
-    image_ = style_image.GetImage(image_client, document, style,
-                                  FlooredIntSize(container_size));
     interpolation_quality_ = style.GetInterpolationQuality();
     if (interpolation_quality_ != previous_interpolation_quality_)
       context.SetImageInterpolationQuality(interpolation_quality_);
-
-    if (layer.MaskSourceType() == kMaskLuminance)
-      context.SetColorFilter(kColorFilterLuminanceToAlpha);
   }
 
-  ~ImagePaintContext() {
+  ~InterpolationQualityContext() {
     if (interpolation_quality_ != previous_interpolation_quality_)
       context_.SetImageInterpolationQuality(previous_interpolation_quality_);
   }
 
-  Image* GetImage() const { return image_.Get(); }
-
-  SkBlendMode CompositeOp() const { return composite_op_; }
-
  private:
-  RefPtr<Image> image_;
   GraphicsContext& context_;
-  SkBlendMode composite_op_;
   InterpolationQuality interpolation_quality_;
   InterpolationQuality previous_interpolation_quality_;
 };
 
-inline bool PaintFastBottomLayer(const LayoutBoxModelObject& obj,
+inline bool PaintFastBottomLayer(const DisplayItemClient& image_client,
+                                 Node* node,
                                  const PaintInfo& paint_info,
                                  const BoxPainterBase::FillLayerInfo& info,
                                  const LayoutRect& rect,
-                                 BackgroundBleedAvoidance bleed_avoidance,
-                                 const LayoutSize& box_size,
-                                 SkBlendMode op,
+                                 const FloatRoundedRect& border_rect,
                                  BackgroundImageGeometry& geometry,
-                                 Optional<ImagePaintContext>& image_context,
-                                 bool has_line_box_sibling) {
+                                 Image* image,
+                                 SkBlendMode composite_op) {
   // Painting a background image from an ancestor onto a cell is a complex case.
   if (geometry.CellUsingContainerBackground())
     return false;
@@ -342,19 +319,15 @@
   // fits within a single tile, and we can paint it using direct draw(R)Rect()
   // calls.
   GraphicsContext& context = paint_info.context;
-  FloatRoundedRect border =
-      info.is_rounded_fill
-          ? BoxPainterBase::BackgroundRoundedRectAdjustedForBleedAvoidance(
-                obj.StyleRef(), rect, bleed_avoidance, has_line_box_sibling,
-                box_size, info.include_left_edge, info.include_right_edge)
-          : FloatRoundedRect(PixelSnappedIntRect(rect));
-
+  FloatRoundedRect border = info.is_rounded_fill
+                                ? border_rect
+                                : FloatRoundedRect(PixelSnappedIntRect(rect));
   Optional<RoundedInnerRectClipper> clipper;
   if (info.is_rounded_fill && !border.IsRenderable()) {
     // When the rrect is not renderable, we resort to clipping.
     // RoundedInnerRectClipper handles this case via discrete, corner-wise
     // clipping.
-    clipper.emplace(obj, paint_info, rect, border, kApplyToContext);
+    clipper.emplace(image_client, paint_info, rect, border, kApplyToContext);
     border.SetRadii(FloatRoundedRect::Radii());
   }
 
@@ -366,24 +339,98 @@
   if (!info.should_paint_image || image_tile.IsEmpty())
     return true;
 
-  if (!image_context || !image_context->GetImage())
+  if (!image)
     return true;
 
   const FloatSize intrinsic_tile_size =
-      image_context->GetImage()->HasRelativeSize()
-          ? image_tile.Size()
-          : FloatSize(image_context->GetImage()->Size());
+      image->HasRelativeSize() ? image_tile.Size() : FloatSize(image->Size());
   const FloatRect src_rect = Image::ComputeSubsetForTile(
       image_tile, border.Rect(), intrinsic_tile_size);
 
   TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "PaintImage",
-               "data", InspectorPaintImageEvent::Data(obj, *info.image));
-  context.DrawImageRRect(image_context->GetImage(), border, src_rect,
-                         image_context->CompositeOp());
+               "data", InspectorPaintImageEvent::Data(node, *info.image));
+  context.DrawImageRRect(image, border, src_rect, composite_op);
 
   return true;
 }
 
+void PaintFillLayerBackground(GraphicsContext& context,
+                              const BoxPainterBase::FillLayerInfo& info,
+                              Image* image,
+                              SkBlendMode composite_op,
+                              const BackgroundImageGeometry& geometry,
+                              Node* node,
+                              LayoutRect scrolled_paint_rect) {
+  // Paint the color first underneath all images, culled if background image
+  // occludes it.
+  // TODO(trchen): In the !bgLayer.hasRepeatXY() case, we could improve the
+  // culling test by verifying whether the background image covers the entire
+  // painting area.
+  if (info.is_bottom_layer && info.color.Alpha() && info.should_paint_color) {
+    IntRect background_rect(PixelSnappedIntRect(scrolled_paint_rect));
+    context.FillRect(background_rect, info.color);
+  }
+
+  // No progressive loading of the background image.
+  if (info.should_paint_image && !geometry.DestRect().IsEmpty()) {
+    TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "PaintImage",
+                 "data", InspectorPaintImageEvent::Data(node, *info.image));
+    context.DrawTiledImage(image, FloatRect(geometry.DestRect()),
+                           FloatPoint(geometry.Phase()),
+                           FloatSize(geometry.TileSize()), composite_op,
+                           FloatSize(geometry.SpaceSize()));
+  }
+}
+
+void PaintFillLayerTextFillBox(GraphicsContext& context,
+                               const BoxPainterBase::FillLayerInfo& info,
+                               Image* image,
+                               SkBlendMode composite_op,
+                               const BackgroundImageGeometry& geometry,
+                               Node* node,
+                               const LayoutRect& rect,
+                               LayoutRect scrolled_paint_rect,
+                               const LayoutBoxModelObject& obj,
+                               const InlineFlowBox* box) {
+  // First figure out how big the mask has to be. It should be no bigger
+  // than what we need to actually render, so we should intersect the dirty
+  // rect with the border box of the background.
+  IntRect mask_rect = PixelSnappedIntRect(rect);
+
+  // We draw the background into a separate layer, to be later masked with
+  // yet another layer holding the text content.
+  GraphicsContextStateSaver background_clip_state_saver(context, false);
+  background_clip_state_saver.Save();
+  context.Clip(mask_rect);
+  context.BeginLayer();
+
+  PaintFillLayerBackground(context, info, image, composite_op, geometry,
+                           obj.GeneratingNode(), scrolled_paint_rect);
+
+  // Create the text mask layer and draw the text into the mask. We do this by
+  // painting using a special paint phase that signals to InlineTextBoxes that
+  // they should just add their contents to the clip.
+  context.BeginLayer(1, SkBlendMode::kDstIn);
+  PaintInfo paint_info(context, mask_rect, kPaintPhaseTextClip,
+                       kGlobalPaintNormalPhase, 0);
+  if (box) {
+    const RootInlineBox& root = box->Root();
+    box->Paint(paint_info,
+               LayoutPoint(scrolled_paint_rect.X() - box->X(),
+                           scrolled_paint_rect.Y() - box->Y()),
+               root.LineTop(), root.LineBottom());
+  } else {
+    // FIXME: this should only have an effect for the line box list within
+    // |obj|. Change this to create a LineBoxListPainter directly.
+    LayoutSize local_offset =
+        obj.IsBox() ? ToLayoutBox(&obj)->LocationOffset() : LayoutSize();
+    obj.Paint(paint_info, scrolled_paint_rect.Location() - local_offset);
+  }
+
+  context.EndLayer();  // Text mask layer.
+  context.EndLayer();  // Background layer.
+}
+
 }  // anonymous namespace
 
 void BoxPainter::PaintFillLayer(const LayoutBoxModelObject& obj,
@@ -434,34 +481,52 @@
                                   this_box.BorderBottom());
   }
 
-  Optional<ImagePaintContext> image_context;
+  RefPtr<Image> image;
+  SkBlendMode composite_op = op;
+  Optional<InterpolationQualityContext> interpolation_quality_context;
   if (info.should_paint_image) {
     geometry.Calculate(paint_info.PaintContainer(),
                        paint_info.GetGlobalPaintFlags(), bg_layer,
                        scrolled_paint_rect);
-    image_context.emplace(geometry.ImageClient(), geometry.ImageDocument(),
-                          geometry.ImageStyle(), context, bg_layer, *info.image,
-                          op, geometry.TileSize());
+    image = info.image->GetImage(
+        geometry.ImageClient(), geometry.ImageDocument(), geometry.ImageStyle(),
+        FlooredIntSize(geometry.TileSize()));
+    interpolation_quality_context.emplace(geometry.ImageStyle(), context);
+
+    if (bg_layer.MaskSourceType() == kMaskLuminance)
+      context.SetColorFilter(kColorFilterLuminanceToAlpha);
+
+    // If op != SkBlendMode::kSrcOver, a mask is being painted.
+    SkBlendMode bg_op = WebCoreCompositeToSkiaComposite(bg_layer.Composite(),
+                                                        bg_layer.BlendMode());
+    composite_op = (op == SkBlendMode::kSrcOver) ? bg_op : op;
   }
 
+  FloatRoundedRect border_rect =
+      info.is_rounded_fill
+          ? RoundedBorderRectForClip(obj.StyleRef(), info, bg_layer, rect,
+                                     bleed_avoidance, has_line_box_sibling,
+                                     box_size, obj.BorderPaddingInsets())
+          : FloatRoundedRect();
+
   // Fast path for drawing simple color backgrounds.
-  if (PaintFastBottomLayer(obj, paint_info, info, rect, bleed_avoidance,
-                           box_size, op, geometry, image_context,
-                           has_line_box_sibling)) {
+  if (PaintFastBottomLayer(obj, obj.GeneratingNode(), paint_info, info, rect,
+                           border_rect, geometry, image.Get(), composite_op)) {
     return;
   }
 
   Optional<RoundedInnerRectClipper> clip_to_border;
-  if (info.is_rounded_fill) {
-    FloatRoundedRect border = RoundedBorderRectForClip(
-        obj.StyleRef(), info, bg_layer, rect, bleed_avoidance,
-        has_line_box_sibling, box_size, obj.BorderPaddingInsets());
-    clip_to_border.emplace(obj, paint_info, rect, border, kApplyToContext);
+  if (info.is_rounded_fill)
+    clip_to_border.emplace(obj, paint_info, rect, border_rect, kApplyToContext);
+
+  if (bg_layer.Clip() == kTextFillBox) {
+    PaintFillLayerTextFillBox(context, info, image.Get(), composite_op,
+                              geometry, obj.GeneratingNode(), rect,
+                              scrolled_paint_rect, obj, box);
+    return;
   }
 
   GraphicsContextStateSaver background_clip_state_saver(context, false);
-  IntRect mask_rect;
-
   switch (bg_layer.Clip()) {
     case kPaddingFillBox:
     case kContentFillBox: {
@@ -482,76 +547,18 @@
       background_clip_state_saver.Save();
       // TODO(chrishtr): this should be pixel-snapped.
       context.Clip(FloatRect(clip_rect));
-
-      break;
-    }
-    case kTextFillBox: {
-      // First figure out how big the mask has to be. It should be no bigger
-      // than what we need to actually render, so we should intersect the dirty
-      // rect with the border box of the background.
-      mask_rect = PixelSnappedIntRect(rect);
-
-      // We draw the background into a separate layer, to be later masked with
-      // yet another layer holding the text content.
-      background_clip_state_saver.Save();
-      context.Clip(mask_rect);
-      context.BeginLayer();
-
       break;
     }
     case kBorderFillBox:
       break;
+    case kTextFillBox:  // fall through
     default:
       NOTREACHED();
       break;
   }
 
-  // Paint the color first underneath all images, culled if background image
-  // occludes it.
-  // TODO(trchen): In the !bgLayer.hasRepeatXY() case, we could improve the
-  // culling test by verifying whether the background image covers the entire
-  // painting area.
-  if (info.is_bottom_layer && info.color.Alpha() && info.should_paint_color) {
-    IntRect background_rect(PixelSnappedIntRect(scrolled_paint_rect));
-    context.FillRect(background_rect, info.color);
-  }
-
-  // no progressive loading of the background image
-  if (info.should_paint_image && !geometry.DestRect().IsEmpty()) {
-    TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "PaintImage",
-                 "data", InspectorPaintImageEvent::Data(obj, *info.image));
-    context.DrawTiledImage(
-        image_context->GetImage(), FloatRect(geometry.DestRect()),
-        FloatPoint(geometry.Phase()), FloatSize(geometry.TileSize()),
-        image_context->CompositeOp(), FloatSize(geometry.SpaceSize()));
-  }
-
-  if (bg_layer.Clip() == kTextFillBox) {
-    // Create the text mask layer.
-    context.BeginLayer(1, SkBlendMode::kDstIn);
-
-    // Now draw the text into the mask. We do this by painting using a special
-    // paint phase that signals to
-    // InlineTextBoxes that they should just add their contents to the clip.
-    PaintInfo info(context, mask_rect, kPaintPhaseTextClip,
-                   kGlobalPaintNormalPhase, 0);
-    if (box) {
-      const RootInlineBox& root = box->Root();
-      box->Paint(info,
-                 LayoutPoint(scrolled_paint_rect.X() - box->X(),
-                             scrolled_paint_rect.Y() - box->Y()),
-                 root.LineTop(), root.LineBottom());
-    } else {
-      // FIXME: this should only have an effect for the line box list within
-      // |obj|. Change this to create a LineBoxListPainter directly.
-      LayoutSize local_offset =
-          obj.IsBox() ? ToLayoutBox(&obj)->LocationOffset() : LayoutSize();
-      obj.Paint(info, scrolled_paint_rect.Location() - local_offset);
-    }
-
-    context.EndLayer();
-    context.EndLayer();
-  }
+  PaintFillLayerBackground(context, info, image.Get(), composite_op, geometry,
+                           obj.GeneratingNode(), scrolled_paint_rect);
 }
 
 void BoxPainter::PaintMask(const PaintInfo& paint_info,
diff --git a/third_party/WebKit/Source/core/scheduler/ThrottlingTest.cpp b/third_party/WebKit/Source/core/scheduler/ThrottlingTest.cpp
index cae8d1a..32679ca 100644
--- a/third_party/WebKit/Source/core/scheduler/ThrottlingTest.cpp
+++ b/third_party/WebKit/Source/core/scheduler/ThrottlingTest.cpp
@@ -68,7 +68,8 @@
 
 class BackgroundRendererThrottlingTest : public SimTest {};
 
-TEST_F(BackgroundRendererThrottlingTest, BackgroundRenderersAreThrottled) {
+TEST_F(BackgroundRendererThrottlingTest,
+       DISABLED_BackgroundRenderersAreThrottled) {
   SimRequest main_resource("https://example.com/", "text/html");
 
   LoadURL("https://example.com/");
diff --git a/third_party/WebKit/Source/devtools/front_end/console_test_runner/ConsoleTestRunner.js b/third_party/WebKit/Source/devtools/front_end/console_test_runner/ConsoleTestRunner.js
index 1f84b873..1ccfafb7 100644
--- a/third_party/WebKit/Source/devtools/front_end/console_test_runner/ConsoleTestRunner.js
+++ b/third_party/WebKit/Source/devtools/front_end/console_test_runner/ConsoleTestRunner.js
@@ -7,10 +7,13 @@
  * @suppress {accessControls}
  */
 
+/** @typedef {function(!Element, !ConsoleModel.ConsoleMessage=):string} */
+ConsoleTestRunner.Formatter;
+
 /**
- * @param {boolean} printOriginatingCommand
- * @param {boolean} dumpClassNames
- * @param {function(!Element, !ConsoleModel.ConsoleMessage):string=} formatter
+ * @param {boolean=} printOriginatingCommand
+ * @param {boolean=} dumpClassNames
+ * @param {!ConsoleTestRunner.Formatter=} formatter
  */
 ConsoleTestRunner.dumpConsoleMessages = function(printOriginatingCommand, dumpClassNames, formatter) {
   TestRunner.addResults(
@@ -18,9 +21,9 @@
 };
 
 /**
- * @param {boolean} printOriginatingCommand
- * @param {boolean} dumpClassNames
- * @param {function(!Element, !ConsoleModel.ConsoleMessage):string=} formatter
+ * @param {boolean=} printOriginatingCommand
+ * @param {boolean=} dumpClassNames
+ * @param {!ConsoleTestRunner.Formatter=} formatter
  * @return {!Array<string>}
  */
 ConsoleTestRunner.dumpConsoleMessagesIntoArray = function(printOriginatingCommand, dumpClassNames, formatter) {
@@ -64,10 +67,9 @@
 
 /**
  * @param {!Element} messageElement
- * @param {!ConsoleModel.ConsoleMessage} consoleMessage
  * @return {string}
  */
-ConsoleTestRunner.prepareConsoleMessageText = function(messageElement, consoleMessage) {
+ConsoleTestRunner.prepareConsoleMessageText = function(messageElement) {
   var messageText = messageElement.deepTextContent().replace(/\u200b/g, '');
   // Replace scriptIds with generic scriptId string to avoid flakiness.
   messageText = messageText.replace(/VM\d+/g, 'VM');
@@ -143,4 +145,371 @@
   viewport.element.style.height = height + 'px';
   viewport.element.style.position = 'absolute';
   viewport.invalidate();
-};
\ No newline at end of file
+};
+
+ConsoleTestRunner.selectMainExecutionContext = function() {
+  var executionContexts = TestRunner.runtimeModel.executionContexts();
+  for (var context of executionContexts) {
+    if (context.isDefault) {
+      UI.context.setFlavor(SDK.ExecutionContext, context);
+      return;
+    }
+  }
+};
+
+/**
+ * @param {string} code
+ * @param {!Function=} callback
+ * @param {boolean=} dontForceMainContext
+ */
+ConsoleTestRunner.evaluateInConsole = function(code, callback, dontForceMainContext) {
+  if (!dontForceMainContext)
+    ConsoleTestRunner.selectMainExecutionContext();
+  callback = TestRunner.safeWrap(callback);
+
+  var consoleView = Console.ConsoleView.instance();
+  consoleView._prompt._appendCommand(code, true);
+  ConsoleTestRunner.addConsoleViewSniffer(function(commandResult) {
+    callback(commandResult.toMessageElement().deepTextContent());
+  });
+};
+
+/**
+ * @param {!Function} override
+ * @param {boolean=} opt_sticky
+ */
+ConsoleTestRunner.addConsoleViewSniffer = function(override, opt_sticky) {
+  TestRunner.addSniffer(Console.ConsoleView.prototype, '_consoleMessageAddedForTest', override, opt_sticky);
+};
+
+/**
+ * @param {string} code
+ * @param {!Function=} callback
+ * @param {boolean=} dontForceMainContext
+ */
+ConsoleTestRunner.evaluateInConsoleAndDump = function(code, callback, dontForceMainContext) {
+  /**
+   * @param {string} text
+   */
+  function mycallback(text) {
+    text = text.replace(/\bVM\d+/g, 'VM');
+    TestRunner.addResult(code + ' = ' + text);
+    callback(text);
+  }
+  ConsoleTestRunner.evaluateInConsole(code, mycallback, dontForceMainContext);
+};
+
+/**
+ * @return {number}
+ */
+ConsoleTestRunner.consoleMessagesCount = function() {
+  var consoleView = Console.ConsoleView.instance();
+  return consoleView._consoleMessages.length;
+};
+
+/**
+ * @param {function(!Element):string} messageFormatter
+ * @param {!Element} node
+ * @return {string}
+ */
+ConsoleTestRunner.formatterIgnoreStackFrameUrls = function(messageFormatter, node) {
+  /**
+   * @param {string} string
+   */
+  function isNotEmptyLine(string) {
+    return string.trim().length > 0;
+  }
+
+  /**
+   * @param {string} string
+   */
+  function ignoreStackFrameAndMutableData(string) {
+    var buffer = string.replace(/\u200b/g, '');
+    buffer = buffer.replace(/VM\d+/g, 'VM');
+    return buffer.replace(/^\s+at [^\]]+(]?)$/, '$1');
+  }
+
+  messageFormatter = messageFormatter || TestRunner.textContentWithLineBreaks;
+  var buffer = messageFormatter(node);
+  return buffer.split('\n').map(ignoreStackFrameAndMutableData).filter(isNotEmptyLine).join('\n');
+};
+
+/**
+ * @param {!Element} element
+ * @param {!ConsoleModel.ConsoleMessage} message
+ * @return {string}
+ */
+ConsoleTestRunner.simpleFormatter = function(element, message) {
+  return message.messageText + ':' + message.line + ':' + message.column;
+};
+
+/**
+ * @param {boolean=} printOriginatingCommand
+ * @param {boolean=} dumpClassNames
+ * @param {!ConsoleTestRunner.Formatter=} messageFormatter
+ */
+ConsoleTestRunner.dumpConsoleMessagesIgnoreErrorStackFrames = function(
+    printOriginatingCommand, dumpClassNames, messageFormatter) {
+  TestRunner.addResults(ConsoleTestRunner.dumpConsoleMessagesIntoArray(
+      printOriginatingCommand, dumpClassNames,
+      messageFormatter ? ConsoleTestRunner.formatterIgnoreStackFrameUrls.bind(this, messageFormatter) : undefined));
+};
+
+ConsoleTestRunner.dumpConsoleMessagesWithStyles = function() {
+  var messageViews = Console.ConsoleView.instance()._visibleViewMessages;
+  for (var i = 0; i < messageViews.length; ++i) {
+    var element = messageViews[i].element();
+    var messageText = ConsoleTestRunner.prepareConsoleMessageText(element);
+    TestRunner.addResult(messageText);
+    var spans = element.querySelectorAll('.console-message-text *');
+    for (var j = 0; j < spans.length; ++j)
+      TestRunner.addResult('Styled text #' + j + ': ' + (spans[j].style.cssText || 'NO STYLES DEFINED'));
+  }
+};
+
+/**
+ * @param {boolean=} sortMessages
+ */
+ConsoleTestRunner.dumpConsoleMessagesWithClasses = function(sortMessages) {
+  var result = [];
+  var messageViews = Console.ConsoleView.instance()._visibleViewMessages;
+  for (var i = 0; i < messageViews.length; ++i) {
+    var element = messageViews[i].element();
+    var contentElement = messageViews[i].contentElement();
+    var messageText = ConsoleTestRunner.prepareConsoleMessageText(element);
+    result.push(messageText + ' ' + element.getAttribute('class') + ' > ' + contentElement.getAttribute('class'));
+  }
+  if (sortMessages)
+    result.sort();
+  TestRunner.addResults(result);
+};
+
+ConsoleTestRunner.dumpConsoleClassesBrief = function() {
+  var messageViews = Console.ConsoleView.instance()._visibleViewMessages;
+  for (var i = 0; i < messageViews.length; ++i)
+    TestRunner.addResult(messageViews[i].toMessageElement().className);
+};
+
+ConsoleTestRunner.dumpConsoleCounters = function() {
+  var counter = Main.Main.WarningErrorCounter._instanceForTest;
+  for (var index = 0; index < counter._titles.length; ++index)
+    TestRunner.addResult(counter._titles[index]);
+  ConsoleTestRunner.dumpConsoleClassesBrief();
+};
+
+/**
+ * @param {!Function} callback
+ * @param {function(!Element):boolean} deepFilter
+ * @param {function(!ObjectUI.ObjectPropertiesSection):boolean} sectionFilter
+ */
+ConsoleTestRunner.expandConsoleMessages = function(callback, deepFilter, sectionFilter) {
+  Console.ConsoleView.instance()._invalidateViewport();
+  var messageViews = Console.ConsoleView.instance()._visibleViewMessages;
+
+  // Initiate round-trips to fetch necessary data for further rendering.
+  for (var i = 0; i < messageViews.length; ++i)
+    messageViews[i].element();
+
+  TestRunner.deprecatedRunAfterPendingDispatches(expandTreeElements);
+
+  function expandTreeElements() {
+    for (var i = 0; i < messageViews.length; ++i) {
+      var element = messageViews[i].element();
+      for (var node = element; node; node = node.traverseNextNode(element)) {
+        if (node.treeElementForTest)
+          node.treeElementForTest.expand();
+        if (node._expandStackTraceForTest)
+          node._expandStackTraceForTest();
+        if (!node._section)
+          continue;
+        if (sectionFilter && !sectionFilter(node._section))
+          continue;
+        node._section.expand();
+
+        if (!deepFilter)
+          continue;
+        var treeElements = node._section.rootElement().children();
+        for (var j = 0; j < treeElements.length; ++j) {
+          for (var treeElement = treeElements[j]; treeElement;
+               treeElement = treeElement.traverseNextTreeElement(true, null, true)) {
+            if (deepFilter(treeElement))
+              treeElement.expand();
+          }
+        }
+      }
+    }
+    TestRunner.deprecatedRunAfterPendingDispatches(callback);
+  }
+};
+
+/**
+ * @param {!Function} callback
+ */
+ConsoleTestRunner.expandGettersInConsoleMessages = function(callback) {
+  var messageViews = Console.ConsoleView.instance()._visibleViewMessages;
+  var properties = [];
+  var propertiesCount = 0;
+  TestRunner.addSniffer(ObjectUI.ObjectPropertyTreeElement.prototype, '_updateExpandable', propertyExpandableUpdated);
+  for (var i = 0; i < messageViews.length; ++i) {
+    var element = messageViews[i].element();
+    for (var node = element; node; node = node.traverseNextNode(element)) {
+      if (node.classList && node.classList.contains('object-value-calculate-value-button')) {
+        ++propertiesCount;
+        node.click();
+        properties.push(node.parentElement.parentElement);
+      }
+    }
+  }
+
+  function propertyExpandableUpdated() {
+    --propertiesCount;
+    if (propertiesCount === 0) {
+      for (var i = 0; i < properties.length; ++i)
+        properties[i].click();
+      TestRunner.deprecatedRunAfterPendingDispatches(callback);
+    } else {
+      TestRunner.addSniffer(
+          ObjectUI.ObjectPropertyTreeElement.prototype, '_updateExpandable', propertyExpandableUpdated);
+    }
+  }
+};
+
+/**
+ * @param {!Function} callback
+ */
+ConsoleTestRunner.expandConsoleMessagesErrorParameters = function(callback) {
+  var messageViews = Console.ConsoleView.instance()._visibleViewMessages;
+  // Initiate round-trips to fetch necessary data for further rendering.
+  for (var i = 0; i < messageViews.length; ++i)
+    messageViews[i].element();
+  TestRunner.deprecatedRunAfterPendingDispatches(callback);
+};
+
+/**
+ * @param {!Function} callback
+ */
+ConsoleTestRunner.waitForRemoteObjectsConsoleMessages = function(callback) {
+  var messages = Console.ConsoleView.instance()._visibleViewMessages;
+  for (var i = 0; i < messages.length; ++i)
+    messages[i].toMessageElement();
+  TestRunner.deprecatedRunAfterPendingDispatches(callback);
+};
+
+/**
+ * @return {!Promise}
+ */
+ConsoleTestRunner.waitUntilConsoleEditorLoaded = function() {
+  var fulfill;
+  var promise = new Promise(x => (fulfill = x));
+  var editor = Console.ConsoleView.instance()._prompt._editor;
+  if (editor)
+    fulfill(editor);
+  else
+    TestRunner.addSniffer(Console.ConsolePrompt.prototype, '_editorSetForTest', _ => fulfill(editor));
+  return promise;
+};
+
+/**
+ * @param {!Function} callback
+ */
+ConsoleTestRunner.waitUntilMessageReceived = function(callback) {
+  TestRunner.addSniffer(ConsoleModel.consoleModel, 'addMessage', callback, false);
+};
+
+/**
+ * @return {!Promise}
+ */
+ConsoleTestRunner.waitUntilMessageReceivedPromise = function() {
+  return new Promise(fulfill => ConsoleTestRunner.waitUntilMessageReceived(fulfill));
+};
+
+/**
+ * @param {number} count
+ * @param {!Function} callback
+ */
+ConsoleTestRunner.waitUntilNthMessageReceived = function(count, callback) {
+  function override() {
+    if (--count === 0)
+      TestRunner.safeWrap(callback)();
+    else
+      TestRunner.addSniffer(ConsoleModel.consoleModel, 'addMessage', override, false);
+  }
+  TestRunner.addSniffer(ConsoleModel.consoleModel, 'addMessage', override, false);
+};
+
+/**
+ * @param {number} count
+ * @return {!Promise}
+ */
+ConsoleTestRunner.waitUntilNthMessageReceivedPromise = function(count) {
+  return new Promise(fulfill => ConsoleTestRunner.waitUntilNthMessageReceived(count, fulfill));
+};
+
+/**
+ * @param {string} namePrefix
+ */
+ConsoleTestRunner.changeExecutionContext = function(namePrefix) {
+  var selector = Console.ConsoleView.instance()._consoleContextSelector;
+  for (var executionContext of selector._items) {
+    if (selector.titleFor(executionContext).startsWith(namePrefix)) {
+      UI.context.setFlavor(SDK.ExecutionContext, executionContext);
+      return;
+    }
+  }
+  TestRunner.addResult('FAILED: context with prefix: ' + namePrefix + ' not found in the context list');
+};
+
+/**
+ * @param {number} expectedCount
+ * @param {!Function} callback
+ */
+ConsoleTestRunner.waitForConsoleMessages = function(expectedCount, callback) {
+  var consoleView = Console.ConsoleView.instance();
+  checkAndReturn();
+
+  function checkAndReturn() {
+    if (consoleView._visibleViewMessages.length === expectedCount) {
+      TestRunner.addResult('Message count: ' + expectedCount);
+      callback();
+    } else {
+      TestRunner.addSniffer(consoleView, '_messageAppendedForTests', checkAndReturn);
+    }
+  }
+};
+
+/**
+ * @param {number} fromMessage
+ * @param {number} fromTextOffset
+ * @param {number} toMessage
+ * @param {number} toTextOffset
+ * @suppressGlobalPropertiesCheck
+ */
+ConsoleTestRunner.selectConsoleMessages = function(fromMessage, fromTextOffset, toMessage, toTextOffset) {
+  var consoleView = Console.ConsoleView.instance();
+  var from = selectionContainerAndOffset(consoleView.itemElement(fromMessage).element(), fromTextOffset);
+  var to = selectionContainerAndOffset(consoleView.itemElement(toMessage).element(), toTextOffset);
+  window.getSelection().setBaseAndExtent(from.container, from.offset, to.container, to.offset);
+
+  /**
+   * @param {!Node} container
+   * @param {number} offset
+   * @return {?{container: !Node, offset: number}}
+   */
+  function selectionContainerAndOffset(container, offset) {
+    /** @type {?Node} */
+    var node = container;
+    if (offset === 0 && container.nodeType !== Node.TEXT_NODE) {
+      container = /** @type {!Node} */ (container.traverseNextTextNode());
+      node = container;
+    }
+    var charCount = 0;
+    while ((node = node.traverseNextTextNode(container))) {
+      var length = node.textContent.length;
+      if (charCount + length >= offset)
+        return {container: node, offset: offset - charCount};
+
+      charCount += length;
+    }
+    return null;
+  }
+};
diff --git a/third_party/WebKit/Source/devtools/front_end/console_test_runner/module.json b/third_party/WebKit/Source/devtools/front_end/console_test_runner/module.json
index 3a9a7cc..a277fc3 100644
--- a/third_party/WebKit/Source/devtools/front_end/console_test_runner/module.json
+++ b/third_party/WebKit/Source/devtools/front_end/console_test_runner/module.json
@@ -3,7 +3,8 @@
     "test_runner",
     "integration_test_runner",
     "console",
-    "console_model"
+    "console_model",
+    "main"
   ],
   "scripts": [
     "ConsoleTestRunner.js"
diff --git a/third_party/WebKit/Source/devtools/front_end/elements_test_runner/ElementsTestRunner.js b/third_party/WebKit/Source/devtools/front_end/elements_test_runner/ElementsTestRunner.js
new file mode 100644
index 0000000..e8111996
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/elements_test_runner/ElementsTestRunner.js
@@ -0,0 +1,81 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview using private properties isn't a Closure violation in tests.
+ * @suppress {accessControls}
+ */
+
+/**
+ * @param {string} idValue
+ * @param {!Function} callback
+ */
+ElementsTestRunner.selectNodeWithId = function(idValue, callback) {
+  callback = TestRunner.safeWrap(callback);
+  function onNodeFound(node) {
+    ElementsTestRunner.selectNode(node).then(callback.bind(null, node));
+  }
+  ElementsTestRunner.nodeWithId(idValue, onNodeFound);
+};
+
+/**
+ * @param {!Object} node
+ * @return {!Promise.<undefined>}
+ */
+ElementsTestRunner.selectNode = function(node) {
+  return Common.Revealer.revealPromise(node);
+};
+
+/**
+ * @param {string} idValue
+ * @param {!Function} callback
+ */
+ElementsTestRunner.nodeWithId = function(idValue, callback) {
+  ElementsTestRunner.findNode(node => node.getAttribute('id') === idValue, callback);
+};
+
+/**
+ * @param {function(!Element): boolean} matchFunction
+ * @param {!Function} callback
+ */
+ElementsTestRunner.findNode = function(matchFunction, callback) {
+  callback = TestRunner.safeWrap(callback);
+  var result = null;
+  var pendingRequests = 0;
+  function processChildren(node) {
+    try {
+      if (result)
+        return;
+
+      var pseudoElementsMap = node.pseudoElements();
+      var pseudoElements = pseudoElementsMap ? pseudoElementsMap.valuesArray() : [];
+      var children = (node.children() || []).concat(node.shadowRoots()).concat(pseudoElements);
+      if (node.templateContent())
+        children.push(node.templateContent());
+      else if (node.importedDocument())
+        children.push(node.importedDocument());
+
+      for (var i = 0; i < children.length; ++i) {
+        var childNode = children[i];
+        if (matchFunction(childNode)) {
+          result = childNode;
+          callback(result);
+          return;
+        }
+        pendingRequests++;
+        childNode.getChildNodes(processChildren.bind(null, childNode));
+      }
+    } finally {
+      pendingRequests--;
+    }
+
+    if (!result && !pendingRequests)
+      callback(null);
+  }
+
+  TestRunner.domModel.requestDocument(doc => {
+    pendingRequests++;
+    doc.getChildNodes(processChildren.bind(null, doc));
+  });
+};
diff --git a/third_party/WebKit/Source/devtools/front_end/elements_test_runner/module.json b/third_party/WebKit/Source/devtools/front_end/elements_test_runner/module.json
new file mode 100644
index 0000000..7af0793
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/elements_test_runner/module.json
@@ -0,0 +1,10 @@
+{
+  "dependencies": [
+    "test_runner",
+    "integration_test_runner",
+    "elements"
+  ],
+  "scripts": [
+    "ElementsTestRunner.js"
+  ]
+}
diff --git a/third_party/WebKit/Source/devtools/front_end/integration_test_runner.json b/third_party/WebKit/Source/devtools/front_end/integration_test_runner.json
index df1387c..3e3dc51a 100644
--- a/third_party/WebKit/Source/devtools/front_end/integration_test_runner.json
+++ b/third_party/WebKit/Source/devtools/front_end/integration_test_runner.json
@@ -3,7 +3,7 @@
     { "name": "test_runner", "type": "autostart" },
     { "name": "integration_test_runner", "type": "autostart" },
     { "name": "console_test_runner" },
-
+    { "name": "elements_test_runner" },
 
 
     { "name": "platform", "type": "autostart" },
diff --git a/third_party/WebKit/Source/devtools/front_end/integration_test_runner/IntegrationTestRunner.js b/third_party/WebKit/Source/devtools/front_end/integration_test_runner/IntegrationTestRunner.js
index 8743227a..a2bc34cd 100644
--- a/third_party/WebKit/Source/devtools/front_end/integration_test_runner/IntegrationTestRunner.js
+++ b/third_party/WebKit/Source/devtools/front_end/integration_test_runner/IntegrationTestRunner.js
@@ -41,10 +41,17 @@
 };
 
 /**
- * @param {string} code
+ * @param {string|!Function} code
  * @param {!Function} callback
  */
 TestRunner.evaluateInPage = async function(code, callback) {
+  if (typeof code === 'function') {
+    if (code.length) {
+      TestRunner.addResult('ERROR: do not use evaluateInPage on a function with parameters: ' + code.toString());
+      TestRunner.addResult('TestRunner.evaluateInPage invokes the function without arguments');
+    }
+    code = `(${code.toString()})()`;
+  }
   var response = await TestRunner.RuntimeAgent.invoke_evaluate({expression: code, objectGroup: 'console'});
   if (!response[Protocol.Error]) {
     TestRunner.safeWrap(callback)(
@@ -53,7 +60,7 @@
 };
 
 /**
- * @param {string} code
+ * @param {string|!Function} code
  * @return {!Promise<!SDK.RemoteObject>}
  */
 TestRunner.evaluateInPagePromise = function(code) {
@@ -69,6 +76,15 @@
   Promise.all(promises).then(TestRunner.safeWrap(callback));
 };
 
+/**
+ * @param {string} html
+ * @return {!Promise<!SDK.RemoteObject>}
+ */
+TestRunner.loadHTML = function(html) {
+  html = html.replace(/'/g, '\\\'').replace(/\n/g, '\\n');
+  return TestRunner.evaluateInPagePromise(`document.write('${html}');document.close();`);
+};
+
 /** @type {boolean} */
 IntegrationTestRunner._startedTest = false;
 
diff --git a/third_party/WebKit/Source/devtools/front_end/network/RequestTimingView.js b/third_party/WebKit/Source/devtools/front_end/network/RequestTimingView.js
index 9654057f..25f63fb 100644
--- a/third_party/WebKit/Source/devtools/front_end/network/RequestTimingView.js
+++ b/third_party/WebKit/Source/devtools/front_end/network/RequestTimingView.js
@@ -251,7 +251,7 @@
     var note = footer.createChild('td');
     note.colSpan = 1;
     note.appendChild(
-        UI.createDocumentationLink('network-performance/reference#timing', Common.UIString('Explanation')));
+        UI.createDocumentationLink('network-performance/reference#timing-explanation', Common.UIString('Explanation')));
     footer.createChild('td');
     footer.createChild('td').createTextChild(Number.secondsToString(totalDuration, true));
 
diff --git a/third_party/WebKit/Source/devtools/front_end/test_runner/TestRunner.js b/third_party/WebKit/Source/devtools/front_end/test_runner/TestRunner.js
index 04a05eb..f5ca4bc 100644
--- a/third_party/WebKit/Source/devtools/front_end/test_runner/TestRunner.js
+++ b/third_party/WebKit/Source/devtools/front_end/test_runner/TestRunner.js
@@ -91,7 +91,7 @@
  * @param {!Object} receiver
  * @param {string} methodName
  * @param {!Function} override
- * @param {boolean} opt_sticky
+ * @param {boolean=} opt_sticky
  */
 TestRunner.addSniffer = function(receiver, methodName, override, opt_sticky) {
   override = TestRunner.safeWrap(override);
@@ -187,7 +187,7 @@
 };
 
 /**
- * @param {!Function} func
+ * @param {!Function|undefined} func
  * @param {!Function=} onexception
  * @return {!Function}
  */
@@ -213,6 +213,44 @@
 };
 
 /**
+ * @param {!Element} node
+ * @return {string}
+ */
+TestRunner.textContentWithLineBreaks = function(node) {
+  function padding(currentNode) {
+    var result = 0;
+    while (currentNode && currentNode !== node) {
+      if (currentNode.nodeName === 'OL' &&
+          !(currentNode.classList && currentNode.classList.contains('object-properties-section')))
+        ++result;
+      currentNode = currentNode.parentNode;
+    }
+    return Array(result * 4 + 1).join(' ');
+  }
+
+  var buffer = '';
+  var currentNode = node;
+  var ignoreFirst = false;
+  while (currentNode.traverseNextNode(node)) {
+    currentNode = currentNode.traverseNextNode(node);
+    if (currentNode.nodeType === Node.TEXT_NODE) {
+      buffer += currentNode.nodeValue;
+    } else if (currentNode.nodeName === 'LI' || currentNode.nodeName === 'TR') {
+      if (!ignoreFirst)
+        buffer += '\n' + padding(currentNode);
+      else
+        ignoreFirst = false;
+    } else if (currentNode.nodeName === 'STYLE') {
+      currentNode = currentNode.traverseNextNode(node);
+      continue;
+    } else if (currentNode.classList && currentNode.classList.contains('object-properties-section')) {
+      ignoreFirst = true;
+    }
+  }
+  return buffer;
+};
+
+/**
  * @param {!Function} testFunction
  * @return {!Function}
  */
diff --git a/third_party/WebKit/Source/modules/mediasource/SourceBuffer.cpp b/third_party/WebKit/Source/modules/mediasource/SourceBuffer.cpp
index dbb1c82..26f9972 100644
--- a/third_party/WebKit/Source/modules/mediasource/SourceBuffer.cpp
+++ b/third_party/WebKit/Source/modules/mediasource/SourceBuffer.cpp
@@ -1041,6 +1041,30 @@
   return true;
 }
 
+void SourceBuffer::NotifyParseWarning(const ParseWarning warning) {
+  switch (warning) {
+    case WebSourceBufferClient::kKeyframeTimeGreaterThanDependant:
+      // Report this problematic GOP structure to help inform follow-up work.
+      // Media engine also records RAPPOR for these, up to once per track, at
+      // Media.OriginUrl.MSE.KeyframeTimeGreaterThanDependant.
+      // TODO(wolenetz): Use the data to scope additional work. See
+      // https://crbug.com/739931.
+      UseCounter::Count(
+          source_->MediaElement()->GetDocument(),
+          WebFeature::kMediaSourceKeyframeTimeGreaterThanDependant);
+      break;
+    case WebSourceBufferClient::kMuxedSequenceMode:
+      // Report this problematic API usage to help inform follow-up work.
+      // Media engine also records RAPPOR for these, up to once per
+      // SourceBuffer, at Media.OriginUrl.MSE.MuxedSequenceModeSourceBuffer.
+      // TODO(wolenetz): Use the data to scope additional work. See
+      // https://crbug.com/737757.
+      UseCounter::Count(source_->MediaElement()->GetDocument(),
+                        WebFeature::kMediaSourceMuxedSequenceMode);
+      break;
+  }
+}
+
 bool SourceBuffer::HasPendingActivity() const {
   return source_;
 }
diff --git a/third_party/WebKit/Source/modules/mediasource/SourceBuffer.h b/third_party/WebKit/Source/modules/mediasource/SourceBuffer.h
index a5f1726..41de6ad 100644
--- a/third_party/WebKit/Source/modules/mediasource/SourceBuffer.h
+++ b/third_party/WebKit/Source/modules/mediasource/SourceBuffer.h
@@ -114,6 +114,7 @@
 
   // WebSourceBufferClient interface
   bool InitializationSegmentReceived(const WebVector<MediaTrackInfo>&) override;
+  void NotifyParseWarning(const ParseWarning) override;
 
   DECLARE_VIRTUAL_TRACE();
 
diff --git a/third_party/WebKit/Source/modules/presentation/PresentationConnection.cpp b/third_party/WebKit/Source/modules/presentation/PresentationConnection.cpp
index 6a8a8aa..54ce9ba 100644
--- a/third_party/WebKit/Source/modules/presentation/PresentationConnection.cpp
+++ b/third_party/WebKit/Source/modules/presentation/PresentationConnection.cpp
@@ -298,28 +298,24 @@
     return false;
   }
 
-  // The connection can send a message if there is a client available.
-  return !!PresentationController::ClientFromContext(GetExecutionContext());
+  return !!proxy_;
 }
 
 void PresentationConnection::HandleMessageQueue() {
-  WebPresentationClient* client =
-      PresentationController::ClientFromContext(GetExecutionContext());
-  if (!client || !proxy_)
+  if (!proxy_)
     return;
 
   while (!messages_.IsEmpty() && !blob_loader_) {
     Message* message = messages_.front().Get();
     switch (message->type) {
       case kMessageTypeText:
-        client->SendString(url_, id_, message->text, proxy_.get());
+        proxy_->SendTextMessage(message->text);
         messages_.pop_front();
         break;
       case kMessageTypeArrayBuffer:
-        client->SendArrayBuffer(
-            url_, id_,
+        proxy_->SendBinaryMessage(
             static_cast<const uint8_t*>(message->array_buffer->Data()),
-            message->array_buffer->ByteLength(), proxy_.get());
+            message->array_buffer->ByteLength());
         messages_.pop_front();
         break;
       case kMessageTypeBlob:
@@ -482,11 +478,9 @@
   DCHECK(buffer);
   DCHECK(buffer->Buffer());
   // Send the loaded blob immediately here and continue processing the queue.
-  WebPresentationClient* client =
-      PresentationController::ClientFromContext(GetExecutionContext());
-  if (client) {
-    client->SendBlobData(url_, id_, static_cast<const uint8_t*>(buffer->Data()),
-                         buffer->ByteLength(), proxy_.get());
+  if (proxy_) {
+    proxy_->SendBinaryMessage(static_cast<const uint8_t*>(buffer->Data()),
+                              buffer->ByteLength());
   }
 
   messages_.pop_front();
diff --git a/third_party/WebKit/Source/modules/presentation/PresentationController.cpp b/third_party/WebKit/Source/modules/presentation/PresentationController.cpp
index c689f1f9..af629e5 100644
--- a/third_party/WebKit/Source/modules/presentation/PresentationController.cpp
+++ b/third_party/WebKit/Source/modules/presentation/PresentationController.cpp
@@ -116,25 +116,6 @@
   connection->DidClose(reason, message);
 }
 
-void PresentationController::DidReceiveConnectionTextMessage(
-    const WebPresentationInfo& presentation_info,
-    const WebString& message) {
-  PresentationConnection* connection = FindConnection(presentation_info);
-  if (!connection)
-    return;
-  connection->DidReceiveTextMessage(message);
-}
-
-void PresentationController::DidReceiveConnectionBinaryMessage(
-    const WebPresentationInfo& presentation_info,
-    const uint8_t* data,
-    size_t length) {
-  PresentationConnection* connection = FindConnection(presentation_info);
-  if (!connection)
-    return;
-  connection->DidReceiveBinaryMessage(data, length);
-}
-
 void PresentationController::SetPresentation(Presentation* presentation) {
   presentation_ = presentation;
 }
diff --git a/third_party/WebKit/Source/modules/presentation/PresentationController.h b/third_party/WebKit/Source/modules/presentation/PresentationController.h
index 99fcbd0..f00c997 100644
--- a/third_party/WebKit/Source/modules/presentation/PresentationController.h
+++ b/third_party/WebKit/Source/modules/presentation/PresentationController.h
@@ -54,11 +54,6 @@
   void DidCloseConnection(const WebPresentationInfo&,
                           WebPresentationConnectionCloseReason,
                           const WebString& message) override;
-  void DidReceiveConnectionTextMessage(const WebPresentationInfo&,
-                                       const WebString&) override;
-  void DidReceiveConnectionBinaryMessage(const WebPresentationInfo&,
-                                         const uint8_t* data,
-                                         size_t length) override;
 
   // Called by the Presentation object to advertize itself to the controller.
   // The Presentation object is kept as a WeakMember in order to avoid keeping
diff --git a/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp b/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp
index 45839d6..3d487fd 100644
--- a/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp
+++ b/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp
@@ -5748,4 +5748,24 @@
                           ObjectOrZero(bound_pixel_unpack_buffer_.Get()));
 }
 
+void WebGL2RenderingContextBase::
+    DrawingBufferClientRestorePixelPackBufferBinding() {
+  if (!ContextGL())
+    return;
+  ContextGL()->BindBuffer(GL_PIXEL_PACK_BUFFER,
+                          ObjectOrZero(bound_pixel_pack_buffer_.Get()));
+}
+
+void WebGL2RenderingContextBase::
+    DrawingBufferClientRestorePixelPackParameters() {
+  if (!ContextGL())
+    return;
+
+  ContextGL()->PixelStorei(GL_PACK_ROW_LENGTH, pack_row_length_);
+  ContextGL()->PixelStorei(GL_PACK_SKIP_ROWS, pack_skip_rows_);
+  ContextGL()->PixelStorei(GL_PACK_SKIP_PIXELS, pack_skip_pixels_);
+
+  WebGLRenderingContextBase::DrawingBufferClientRestorePixelPackParameters();
+}
+
 }  // namespace blink
diff --git a/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.h b/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.h
index 170aa7a7..90b7498 100644
--- a/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.h
+++ b/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.h
@@ -989,6 +989,8 @@
 
   // DrawingBuffer::Client implementation.
   void DrawingBufferClientRestorePixelUnpackBufferBinding() override;
+  void DrawingBufferClientRestorePixelPackBufferBinding() override;
+  void DrawingBufferClientRestorePixelPackParameters() override;
 
   // Helper function to validate target and the attachment combination for
   // getFramebufferAttachmentParameters.  Generate GL error and return false if
diff --git a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp
index c29ce69..40c14f6 100644
--- a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp
+++ b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp
@@ -6344,7 +6344,8 @@
   ContextGL()->ClearStencil(clear_stencil_);
 }
 
-void WebGLRenderingContextBase::DrawingBufferClientRestorePixelPackAlignment() {
+void WebGLRenderingContextBase::
+    DrawingBufferClientRestorePixelPackParameters() {
   if (!ContextGL())
     return;
   ContextGL()->PixelStorei(GL_PACK_ALIGNMENT, pack_alignment_);
@@ -6372,6 +6373,8 @@
 
 void WebGLRenderingContextBase::
     DrawingBufferClientRestorePixelUnpackBufferBinding() {}
+void WebGLRenderingContextBase::
+    DrawingBufferClientRestorePixelPackBufferBinding() {}
 
 ScriptValue WebGLRenderingContextBase::GetBooleanParameter(
     ScriptState* script_state,
diff --git a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.h b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.h
index 16243349..7dce3c5 100644
--- a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.h
+++ b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.h
@@ -642,11 +642,12 @@
   bool DrawingBufferClientIsBoundForDraw() override;
   void DrawingBufferClientRestoreScissorTest() override;
   void DrawingBufferClientRestoreMaskAndClearValues() override;
-  void DrawingBufferClientRestorePixelPackAlignment() override;
+  void DrawingBufferClientRestorePixelPackParameters() override;
   void DrawingBufferClientRestoreTexture2DBinding() override;
   void DrawingBufferClientRestoreRenderbufferBinding() override;
   void DrawingBufferClientRestoreFramebufferBinding() override;
   void DrawingBufferClientRestorePixelUnpackBufferBinding() override;
+  void DrawingBufferClientRestorePixelPackBufferBinding() override;
 
   virtual void DestroyContext();
   void MarkContextChanged(ContentChangeType);
diff --git a/third_party/WebKit/Source/platform/exported/Platform.cpp b/third_party/WebKit/Source/platform/exported/Platform.cpp
index 5860866b..ecb6dc87 100644
--- a/third_party/WebKit/Source/platform/exported/Platform.cpp
+++ b/third_party/WebKit/Source/platform/exported/Platform.cpp
@@ -34,6 +34,7 @@
 
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/trace_event/memory_dump_manager.h"
+#include "platform/FontFamilyNames.h"
 #include "platform/Histogram.h"
 #include "platform/Language.h"
 #include "platform/MemoryCoordinator.h"
@@ -123,6 +124,11 @@
         base::ThreadTaskRunnerHandle::Get());
 
   ThreadState::AttachMainThread();
+
+  // FontFamilyNames are used by platform/fonts and are initialized by core.
+  // In case core is not available (like on PPAPI plugins), we need to init
+  // them here.
+  FontFamilyNames::init();
   InitializePlatformLanguage();
 
   // TODO(ssid): remove this check after fixing crbug.com/486782.
diff --git a/third_party/WebKit/Source/platform/exported/WebMediaStream.cpp b/third_party/WebKit/Source/platform/exported/WebMediaStream.cpp
index a2c065f5..88d3825 100644
--- a/third_party/WebKit/Source/platform/exported/WebMediaStream.cpp
+++ b/third_party/WebKit/Source/platform/exported/WebMediaStream.cpp
@@ -40,9 +40,10 @@
 
 namespace {
 
-class ExtraDataContainer : public MediaStreamDescriptor::ExtraData {
+class MediaStreamExtraDataContainer : public MediaStreamDescriptor::ExtraData {
  public:
-  ExtraDataContainer(std::unique_ptr<WebMediaStream::ExtraData> extra_data)
+  MediaStreamExtraDataContainer(
+      std::unique_ptr<WebMediaStream::ExtraData> extra_data)
       : extra_data_(std::move(extra_data)) {}
 
   WebMediaStream::ExtraData* GetExtraData() { return extra_data_.get(); }
@@ -68,12 +69,12 @@
   MediaStreamDescriptor::ExtraData* data = private_->GetExtraData();
   if (!data)
     return 0;
-  return static_cast<ExtraDataContainer*>(data)->GetExtraData();
+  return static_cast<MediaStreamExtraDataContainer*>(data)->GetExtraData();
 }
 
 void WebMediaStream::SetExtraData(ExtraData* extra_data) {
-  private_->SetExtraData(
-      WTF::WrapUnique(new ExtraDataContainer(WTF::WrapUnique(extra_data))));
+  private_->SetExtraData(WTF::WrapUnique(
+      new MediaStreamExtraDataContainer(WTF::WrapUnique(extra_data))));
 }
 
 void WebMediaStream::AudioTracks(
diff --git a/third_party/WebKit/Source/platform/exported/WebMediaStreamSource.cpp b/third_party/WebKit/Source/platform/exported/WebMediaStreamSource.cpp
index cc7cb6c..9351cf6b 100644
--- a/third_party/WebKit/Source/platform/exported/WebMediaStreamSource.cpp
+++ b/third_party/WebKit/Source/platform/exported/WebMediaStreamSource.cpp
@@ -45,9 +45,10 @@
 
 namespace {
 
-class ExtraDataContainer : public MediaStreamSource::ExtraData {
+class MediaStreamSourceExtraDataContainer
+    : public MediaStreamSource::ExtraData {
  public:
-  ExtraDataContainer(
+  MediaStreamSourceExtraDataContainer(
       std::unique_ptr<WebMediaStreamSource::ExtraData> extra_data)
       : extra_data_(std::move(extra_data)) {}
 
@@ -141,7 +142,8 @@
   MediaStreamSource::ExtraData* data = private_->GetExtraData();
   if (!data)
     return 0;
-  return static_cast<ExtraDataContainer*>(data)->GetExtraData();
+  return static_cast<MediaStreamSourceExtraDataContainer*>(data)
+      ->GetExtraData();
 }
 
 void WebMediaStreamSource::SetExtraData(ExtraData* extra_data) {
@@ -150,8 +152,8 @@
   if (extra_data)
     extra_data->SetOwner(private_.Get());
 
-  private_->SetExtraData(
-      WTF::WrapUnique(new ExtraDataContainer(WTF::WrapUnique(extra_data))));
+  private_->SetExtraData(WTF::WrapUnique(
+      new MediaStreamSourceExtraDataContainer(WTF::WrapUnique(extra_data))));
 }
 
 void WebMediaStreamSource::SetEchoCancellation(bool echo_cancellation) {
diff --git a/third_party/WebKit/Source/platform/exported/WebPrerender.cpp b/third_party/WebKit/Source/platform/exported/WebPrerender.cpp
index 83eacb0..d7cb1cf 100644
--- a/third_party/WebKit/Source/platform/exported/WebPrerender.cpp
+++ b/third_party/WebKit/Source/platform/exported/WebPrerender.cpp
@@ -39,19 +39,19 @@
 
 namespace {
 
-class ExtraDataContainer : public Prerender::ExtraData {
+class PrerenderExtraDataContainer : public Prerender::ExtraData {
  public:
-  static PassRefPtr<ExtraDataContainer> Create(
+  static PassRefPtr<PrerenderExtraDataContainer> Create(
       WebPrerender::ExtraData* extra_data) {
-    return AdoptRef(new ExtraDataContainer(extra_data));
+    return AdoptRef(new PrerenderExtraDataContainer(extra_data));
   }
 
-  ~ExtraDataContainer() override {}
+  ~PrerenderExtraDataContainer() override {}
 
   WebPrerender::ExtraData* GetExtraData() const { return extra_data_.get(); }
 
  private:
-  explicit ExtraDataContainer(WebPrerender::ExtraData* extra_data)
+  explicit PrerenderExtraDataContainer(WebPrerender::ExtraData* extra_data)
       : extra_data_(WTF::WrapUnique(extra_data)) {}
 
   std::unique_ptr<WebPrerender::ExtraData> extra_data_;
@@ -94,14 +94,14 @@
 }
 
 void WebPrerender::SetExtraData(WebPrerender::ExtraData* extra_data) {
-  private_->SetExtraData(ExtraDataContainer::Create(extra_data));
+  private_->SetExtraData(PrerenderExtraDataContainer::Create(extra_data));
 }
 
 const WebPrerender::ExtraData* WebPrerender::GetExtraData() const {
   RefPtr<Prerender::ExtraData> webcore_extra_data = private_->GetExtraData();
   if (!webcore_extra_data)
     return 0;
-  return static_cast<ExtraDataContainer*>(webcore_extra_data.Get())
+  return static_cast<PrerenderExtraDataContainer*>(webcore_extra_data.Get())
       ->GetExtraData();
 }
 
diff --git a/third_party/WebKit/Source/platform/exported/WebURLRequest.cpp b/third_party/WebKit/Source/platform/exported/WebURLRequest.cpp
index 85e95e73..b195f8b 100644
--- a/third_party/WebKit/Source/platform/exported/WebURLRequest.cpp
+++ b/third_party/WebKit/Source/platform/exported/WebURLRequest.cpp
@@ -45,19 +45,19 @@
 
 namespace {
 
-class ExtraDataContainer : public ResourceRequest::ExtraData {
+class URLRequestExtraDataContainer : public ResourceRequest::ExtraData {
  public:
-  static PassRefPtr<ExtraDataContainer> Create(
+  static PassRefPtr<URLRequestExtraDataContainer> Create(
       WebURLRequest::ExtraData* extra_data) {
-    return AdoptRef(new ExtraDataContainer(extra_data));
+    return AdoptRef(new URLRequestExtraDataContainer(extra_data));
   }
 
-  ~ExtraDataContainer() override {}
+  ~URLRequestExtraDataContainer() override {}
 
   WebURLRequest::ExtraData* GetExtraData() const { return extra_data_.get(); }
 
  private:
-  explicit ExtraDataContainer(WebURLRequest::ExtraData* extra_data)
+  explicit URLRequestExtraDataContainer(WebURLRequest::ExtraData* extra_data)
       : extra_data_(WTF::WrapUnique(extra_data)) {}
 
   std::unique_ptr<WebURLRequest::ExtraData> extra_data_;
@@ -367,12 +367,14 @@
   RefPtr<ResourceRequest::ExtraData> data = resource_request_->GetExtraData();
   if (!data)
     return 0;
-  return static_cast<ExtraDataContainer*>(data.Get())->GetExtraData();
+  return static_cast<URLRequestExtraDataContainer*>(data.Get())->GetExtraData();
 }
 
 void WebURLRequest::SetExtraData(WebURLRequest::ExtraData* extra_data) {
-  if (extra_data != GetExtraData())
-    resource_request_->SetExtraData(ExtraDataContainer::Create(extra_data));
+  if (extra_data != GetExtraData()) {
+    resource_request_->SetExtraData(
+        URLRequestExtraDataContainer::Create(extra_data));
+  }
 }
 
 ResourceRequest& WebURLRequest::ToMutableResourceRequest() {
diff --git a/third_party/WebKit/Source/platform/exported/WebURLResponse.cpp b/third_party/WebKit/Source/platform/exported/WebURLResponse.cpp
index 4bd02d4..22917431 100644
--- a/third_party/WebKit/Source/platform/exported/WebURLResponse.cpp
+++ b/third_party/WebKit/Source/platform/exported/WebURLResponse.cpp
@@ -47,19 +47,19 @@
 
 namespace {
 
-class ExtraDataContainer : public ResourceResponse::ExtraData {
+class URLResponseExtraDataContainer : public ResourceResponse::ExtraData {
  public:
-  static PassRefPtr<ExtraDataContainer> Create(
+  static PassRefPtr<URLResponseExtraDataContainer> Create(
       WebURLResponse::ExtraData* extra_data) {
-    return AdoptRef(new ExtraDataContainer(extra_data));
+    return AdoptRef(new URLResponseExtraDataContainer(extra_data));
   }
 
-  ~ExtraDataContainer() override {}
+  ~URLResponseExtraDataContainer() override {}
 
   WebURLResponse::ExtraData* GetExtraData() const { return extra_data_.get(); }
 
  private:
-  explicit ExtraDataContainer(WebURLResponse::ExtraData* extra_data)
+  explicit URLResponseExtraDataContainer(WebURLResponse::ExtraData* extra_data)
       : extra_data_(WTF::WrapUnique(extra_data)) {}
 
   std::unique_ptr<WebURLResponse::ExtraData> extra_data_;
@@ -360,12 +360,15 @@
   RefPtr<ResourceResponse::ExtraData> data = resource_response_->GetExtraData();
   if (!data)
     return 0;
-  return static_cast<ExtraDataContainer*>(data.Get())->GetExtraData();
+  return static_cast<URLResponseExtraDataContainer*>(data.Get())
+      ->GetExtraData();
 }
 
 void WebURLResponse::SetExtraData(WebURLResponse::ExtraData* extra_data) {
-  if (extra_data != GetExtraData())
-    resource_response_->SetExtraData(ExtraDataContainer::Create(extra_data));
+  if (extra_data != GetExtraData()) {
+    resource_response_->SetExtraData(
+        URLResponseExtraDataContainer::Create(extra_data));
+  }
 }
 
 void WebURLResponse::AppendRedirectResponse(const WebURLResponse& response) {
diff --git a/third_party/WebKit/Source/platform/graphics/gpu/DrawingBuffer.cpp b/third_party/WebKit/Source/platform/graphics/gpu/DrawingBuffer.cpp
index 9a6209f..da8e3fe5 100644
--- a/third_party/WebKit/Source/platform/graphics/gpu/DrawingBuffer.cpp
+++ b/third_party/WebKit/Source/platform/graphics/gpu/DrawingBuffer.cpp
@@ -76,7 +76,7 @@
     bool want_stencil_buffer,
     bool want_antialiasing,
     PreserveDrawingBuffer preserve,
-    WebGLVersion web_gl_version,
+    WebGLVersion webgl_version,
     ChromiumImageUsage chromium_image_usage,
     const CanvasColorParams& color_params) {
   DCHECK(context_provider);
@@ -119,7 +119,7 @@
   RefPtr<DrawingBuffer> drawing_buffer = AdoptRef(new DrawingBuffer(
       std::move(context_provider), std::move(extensions_util), client,
       discard_framebuffer_supported, want_alpha_channel, premultiplied_alpha,
-      preserve, web_gl_version, want_depth_buffer, want_stencil_buffer,
+      preserve, webgl_version, want_depth_buffer, want_stencil_buffer,
       chromium_image_usage, color_params));
   if (!drawing_buffer->Initialize(size, multisample_supported)) {
     drawing_buffer->BeginDestruction();
@@ -140,14 +140,14 @@
     bool want_alpha_channel,
     bool premultiplied_alpha,
     PreserveDrawingBuffer preserve,
-    WebGLVersion web_gl_version,
+    WebGLVersion webgl_version,
     bool want_depth,
     bool want_stencil,
     ChromiumImageUsage chromium_image_usage,
     const CanvasColorParams& color_params)
     : client_(client),
       preserve_drawing_buffer_(preserve),
-      web_gl_version_(web_gl_version),
+      webgl_version_(webgl_version),
       context_provider_(WTF::WrapUnique(new WebGraphicsContext3DProviderWrapper(
           std::move(context_provider)))),
       gl_(this->ContextProvider()->ContextGL()),
@@ -340,7 +340,7 @@
     viz::TextureMailbox* out_mailbox,
     std::unique_ptr<cc::SingleReleaseCallback>* out_release_callback) {
   DCHECK(state_restorer_);
-  if (web_gl_version_ > kWebGL1) {
+  if (webgl_version_ > kWebGL1) {
     state_restorer_->SetPixelUnpackBufferBindingDirty();
     gl_->BindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
   }
@@ -671,7 +671,7 @@
   // textures only if ScreenSpaceAntialiasing is enabled, because
   // ScreenSpaceAntialiasing is much faster with storage textures.
   storage_texture_supported_ =
-      (web_gl_version_ > kWebGL1 ||
+      (webgl_version_ > kWebGL1 ||
        extensions_util_->SupportsExtension("GL_EXT_texture_storage")) &&
       anti_aliasing_mode_ == kScreenSpaceAntialiasing;
   sample_count_ = std::min(4, max_sample_count);
@@ -1038,11 +1038,12 @@
 void DrawingBuffer::RestoreAllState() {
   client_->DrawingBufferClientRestoreScissorTest();
   client_->DrawingBufferClientRestoreMaskAndClearValues();
-  client_->DrawingBufferClientRestorePixelPackAlignment();
+  client_->DrawingBufferClientRestorePixelPackParameters();
   client_->DrawingBufferClientRestoreTexture2DBinding();
   client_->DrawingBufferClientRestoreRenderbufferBinding();
   client_->DrawingBufferClientRestoreFramebufferBinding();
   client_->DrawingBufferClientRestorePixelUnpackBufferBinding();
+  client_->DrawingBufferClientRestorePixelPackBufferBinding();
 }
 
 bool DrawingBuffer::Multisample() const {
@@ -1106,8 +1107,16 @@
                                         ReadbackOrder readback_order,
                                         WebGLImageConversion::AlphaOp op) {
   DCHECK(state_restorer_);
-  state_restorer_->SetPixelPackAlignmentDirty();
+  state_restorer_->SetPixelPackParametersDirty();
   gl_->PixelStorei(GL_PACK_ALIGNMENT, 1);
+  if (webgl_version_ > kWebGL1) {
+    gl_->PixelStorei(GL_PACK_SKIP_ROWS, 0);
+    gl_->PixelStorei(GL_PACK_SKIP_PIXELS, 0);
+    gl_->PixelStorei(GL_PACK_ROW_LENGTH, 0);
+
+    state_restorer_->SetPixelPackBufferBindingDirty();
+    gl_->BindBuffer(GL_PIXEL_PACK_BUFFER, 0);
+  }
   gl_->ReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
 
   size_t buffer_size = 4 * width * height;
@@ -1371,8 +1380,8 @@
     client->DrawingBufferClientRestoreScissorTest();
     client->DrawingBufferClientRestoreMaskAndClearValues();
   }
-  if (pixel_pack_alignment_dirty_)
-    client->DrawingBufferClientRestorePixelPackAlignment();
+  if (pixel_pack_parameters_dirty_)
+    client->DrawingBufferClientRestorePixelPackParameters();
   if (texture_binding_dirty_)
     client->DrawingBufferClientRestoreTexture2DBinding();
   if (renderbuffer_binding_dirty_)
@@ -1381,6 +1390,8 @@
     client->DrawingBufferClientRestoreFramebufferBinding();
   if (pixel_unpack_buffer_binding_dirty_)
     client->DrawingBufferClientRestorePixelUnpackBufferBinding();
+  if (pixel_pack_buffer_binding_dirty_)
+    client->DrawingBufferClientRestorePixelPackBufferBinding();
 }
 
 bool DrawingBuffer::ShouldUseChromiumImage() {
diff --git a/third_party/WebKit/Source/platform/graphics/gpu/DrawingBuffer.h b/third_party/WebKit/Source/platform/graphics/gpu/DrawingBuffer.h
index f3ea0097..2b95135 100644
--- a/third_party/WebKit/Source/platform/graphics/gpu/DrawingBuffer.h
+++ b/third_party/WebKit/Source/platform/graphics/gpu/DrawingBuffer.h
@@ -89,12 +89,15 @@
     virtual void DrawingBufferClientRestoreScissorTest() = 0;
     // Restores the mask and clear value for color, depth, and stencil buffers.
     virtual void DrawingBufferClientRestoreMaskAndClearValues() = 0;
-    virtual void DrawingBufferClientRestorePixelPackAlignment() = 0;
+    // Assume client knows the GL/WebGL version and restore necessary params
+    // accordingly.
+    virtual void DrawingBufferClientRestorePixelPackParameters() = 0;
     // Restores the GL_TEXTURE_2D binding for the active texture unit only.
     virtual void DrawingBufferClientRestoreTexture2DBinding() = 0;
     virtual void DrawingBufferClientRestoreRenderbufferBinding() = 0;
     virtual void DrawingBufferClientRestoreFramebufferBinding() = 0;
     virtual void DrawingBufferClientRestorePixelUnpackBufferBinding() = 0;
+    virtual void DrawingBufferClientRestorePixelPackBufferBinding() = 0;
   };
 
   enum PreserveDrawingBuffer {
@@ -279,24 +282,28 @@
 
     // Mark parts of the state that are dirty and need to be restored.
     void SetClearStateDirty() { clear_state_dirty_ = true; }
-    void SetPixelPackAlignmentDirty() { pixel_pack_alignment_dirty_ = true; }
+    void SetPixelPackParametersDirty() { pixel_pack_parameters_dirty_ = true; }
     void SetTextureBindingDirty() { texture_binding_dirty_ = true; }
     void SetRenderbufferBindingDirty() { renderbuffer_binding_dirty_ = true; }
     void SetFramebufferBindingDirty() { framebuffer_binding_dirty_ = true; }
     void SetPixelUnpackBufferBindingDirty() {
       pixel_unpack_buffer_binding_dirty_ = true;
     }
+    void SetPixelPackBufferBindingDirty() {
+      pixel_pack_buffer_binding_dirty_ = true;
+    }
 
    private:
     RefPtr<DrawingBuffer> drawing_buffer_;
     // The previous state restorer, in case restorers are nested.
     ScopedStateRestorer* previous_state_restorer_ = nullptr;
     bool clear_state_dirty_ = false;
-    bool pixel_pack_alignment_dirty_ = false;
+    bool pixel_pack_parameters_dirty_ = false;
     bool texture_binding_dirty_ = false;
     bool renderbuffer_binding_dirty_ = false;
     bool framebuffer_binding_dirty_ = false;
     bool pixel_unpack_buffer_binding_dirty_ = false;
+    bool pixel_pack_buffer_binding_dirty_ = false;
   };
 
   // All parameters necessary to generate the texture for the ColorBuffer.
@@ -457,7 +464,7 @@
   Client* client_ = nullptr;
 
   const PreserveDrawingBuffer preserve_drawing_buffer_;
-  const WebGLVersion web_gl_version_;
+  const WebGLVersion webgl_version_;
 
   std::unique_ptr<WebGraphicsContext3DProviderWrapper> context_provider_;
   // Lifetime is tied to the m_contextProvider.
diff --git a/third_party/WebKit/Source/platform/graphics/gpu/DrawingBufferTestHelpers.h b/third_party/WebKit/Source/platform/graphics/gpu/DrawingBufferTestHelpers.h
index 1c4fad3..4e54511af 100644
--- a/third_party/WebKit/Source/platform/graphics/gpu/DrawingBufferTestHelpers.h
+++ b/third_party/WebKit/Source/platform/graphics/gpu/DrawingBufferTestHelpers.h
@@ -147,8 +147,16 @@
   }
 
   void BindBuffer(GLenum target, GLuint buffer) override {
-    if (target == GL_PIXEL_UNPACK_BUFFER)
-      state_.pixel_unpack_buffer_binding = buffer;
+    switch (target) {
+      case GL_PIXEL_UNPACK_BUFFER:
+        state_.pixel_unpack_buffer_binding = buffer;
+        break;
+      case GL_PIXEL_PACK_BUFFER:
+        state_.pixel_pack_buffer_binding = buffer;
+        break;
+      default:
+        break;
+    }
   }
 
   GLuint64 InsertFenceSyncCHROMIUM() override {
@@ -279,7 +287,8 @@
     state_.depth_mask = saved_state_.depth_mask;
     state_.stencil_mask = saved_state_.stencil_mask;
   }
-  void DrawingBufferClientRestorePixelPackAlignment() override {
+  void DrawingBufferClientRestorePixelPackParameters() override {
+    // TODO(zmo): restore ES3 pack parameters?
     state_.pack_alignment = saved_state_.pack_alignment;
   }
   void DrawingBufferClientRestoreTexture2DBinding() override {
@@ -296,6 +305,9 @@
     state_.pixel_unpack_buffer_binding =
         saved_state_.pixel_unpack_buffer_binding;
   }
+  void DrawingBufferClientRestorePixelPackBufferBinding() override {
+    state_.pixel_pack_buffer_binding = saved_state_.pixel_pack_buffer_binding;
+  }
 
   // Testing methods.
   gpu::SyncToken MostRecentlyWaitedSyncToken() const {
@@ -331,6 +343,8 @@
               saved_state_.read_framebuffer_binding);
     EXPECT_EQ(state_.pixel_unpack_buffer_binding,
               saved_state_.pixel_unpack_buffer_binding);
+    EXPECT_EQ(state_.pixel_pack_buffer_binding,
+              saved_state_.pixel_pack_buffer_binding);
   }
 
  private:
@@ -356,6 +370,7 @@
     GLuint draw_framebuffer_binding = 0;
     GLuint read_framebuffer_binding = 0;
     GLuint pixel_unpack_buffer_binding = 0;
+    GLuint pixel_pack_buffer_binding = 0;
   };
   State state_;
   State saved_state_;
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc
index 5e87c6f..b232649 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc
@@ -1195,11 +1195,6 @@
     new_policy.timer_queue_policy().is_suspended = true;
   }
 
-  if (GetMainThreadOnly().renderer_backgrounded &&
-      RuntimeEnabledFeatures::TimerThrottlingForBackgroundTabsEnabled()) {
-    new_policy.timer_queue_policy().is_throttled = true;
-  }
-
   if (GetMainThreadOnly().use_virtual_time) {
     new_policy.compositor_queue_policy().use_virtual_time = true;
     new_policy.default_queue_policy().use_virtual_time = true;
diff --git a/third_party/WebKit/Source/platform/wtf/typed_arrays/ArrayBufferContents.cpp b/third_party/WebKit/Source/platform/wtf/typed_arrays/ArrayBufferContents.cpp
index 96eb3267..336a685 100644
--- a/third_party/WebKit/Source/platform/wtf/typed_arrays/ArrayBufferContents.cpp
+++ b/third_party/WebKit/Source/platform/wtf/typed_arrays/ArrayBufferContents.cpp
@@ -123,10 +123,26 @@
   return AllocateMemoryWithFlags(size, policy, base::PartitionAllocReturnNull);
 }
 
+// This method is used by V8's WebAssembly implementation to reserve a large
+// amount of inaccessible address space. This is used to enforce memory safety
+// in Wasm programs.
+void* ArrayBufferContents::ReserveMemory(size_t size) {
+  void* const hint = nullptr;
+  const size_t align = 64 << 10;  // Wasm page size
+  // TODO(crbug.com/735209): On Windows this commits all the memory, rather than
+  // just reserving it. This is very bad and should be fixed, but we don't use
+  // this feature on Windows at all yet.
+  return base::AllocPages(hint, size, align, base::PageInaccessible);
+}
+
 void ArrayBufferContents::FreeMemory(void* data) {
   PartitionFreeGeneric(Partitions::ArrayBufferPartition(), data);
 }
 
+void ArrayBufferContents::ReleaseReservedMemory(void* data, size_t size) {
+  base::FreePages(data, size);
+}
+
 ArrayBufferContents::DataHandle ArrayBufferContents::CreateDataHandle(
     size_t size,
     InitializationPolicy policy) {
@@ -145,7 +161,6 @@
     AdjustAmountOfExternalAllocatedMemory(
         -static_cast<int64_t>(size_in_bytes_));
 
-  data_.reset();
   size_in_bytes_ = 0;
   is_shared_ = kNotShared;
 }
@@ -191,7 +206,7 @@
     return;
 
   size_in_bytes_ = source.SizeInBytes();
-  memcpy(data_.get(), source.Data(), source.SizeInBytes());
+  memcpy(data_.Data(), source.Data(), source.SizeInBytes());
 
   AdjustAmountOfExternalAllocatedMemory(size_in_bytes_);
 }
diff --git a/third_party/WebKit/Source/platform/wtf/typed_arrays/ArrayBufferContents.h b/third_party/WebKit/Source/platform/wtf/typed_arrays/ArrayBufferContents.h
index a4ee2d61..b6428342 100644
--- a/third_party/WebKit/Source/platform/wtf/typed_arrays/ArrayBufferContents.h
+++ b/third_party/WebKit/Source/platform/wtf/typed_arrays/ArrayBufferContents.h
@@ -51,7 +51,91 @@
   // Most clients would want to use ArrayBufferContents::createData, which
   // allocates memory and specifies the correct deleter.
   using DataDeleter = void (*)(void* data);
-  using DataHandle = std::unique_ptr<void, DataDeleter>;
+
+  enum class AllocationKind { kNormal, kReservation };
+
+  class DataHandle {
+    WTF_MAKE_NONCOPYABLE(DataHandle);
+
+   public:
+    DataHandle(void* data, DataDeleter deleter)
+        : allocation_base_(data),
+          allocation_length_(0),
+          data_(data),
+          data_length_(0),
+          kind_(AllocationKind::kNormal),
+          deleter_(deleter) {}
+    DataHandle(void* allocation_base,
+               size_t allocation_length,
+               void* data,
+               size_t data_length,
+               AllocationKind kind,
+               DataDeleter deleter)
+        : allocation_base_(allocation_base),
+          allocation_length_(allocation_length),
+          data_(data),
+          data_length_(data_length),
+          kind_(kind),
+          deleter_(deleter) {
+      DCHECK(reinterpret_cast<uintptr_t>(allocation_base_) <=
+             reinterpret_cast<uintptr_t>(data_));
+      DCHECK(reinterpret_cast<uintptr_t>(data_) + data_length_ <=
+             reinterpret_cast<uintptr_t>(allocation_base_) +
+                 allocation_length_);
+    }
+    // Move constructor
+    DataHandle(DataHandle&& other) { *this = std::move(other); }
+    ~DataHandle() {
+      if (!allocation_base_)
+        return;
+      DCHECK(reinterpret_cast<uintptr_t>(allocation_base_) <=
+             reinterpret_cast<uintptr_t>(data_));
+      DCHECK(reinterpret_cast<uintptr_t>(data_) + data_length_ <=
+             reinterpret_cast<uintptr_t>(allocation_base_) +
+                 allocation_length_);
+      switch (kind_) {
+        case AllocationKind::kNormal:
+          DCHECK(deleter_);
+          deleter_(data_);
+          return;
+        case AllocationKind::kReservation:
+          ReleaseReservedMemory(allocation_base_, allocation_length_);
+          return;
+      }
+    }
+
+    // Move operator
+    DataHandle& operator=(DataHandle&& other) {
+      allocation_base_ = other.allocation_base_;
+      allocation_length_ = other.allocation_length_;
+      data_ = other.data_;
+      data_length_ = other.data_length_;
+      kind_ = other.kind_;
+      deleter_ = other.deleter_;
+      other.allocation_base_ = nullptr;
+      return *this;
+    }
+
+    void* AllocationBase() const { return allocation_base_; }
+    size_t AllocationLength() const { return allocation_length_; }
+
+    void* Data() const { return data_; }
+    size_t DataLength() const { return data_length_; }
+
+    AllocationKind AllocationKind() const { return kind_; }
+
+    operator bool() const { return allocation_base_; }
+
+   private:
+    void* allocation_base_;
+    size_t allocation_length_;
+
+    void* data_;
+    size_t data_length_;
+
+    ArrayBufferContents::AllocationKind kind_;
+    DataDeleter deleter_;
+  };
 
   enum InitializationPolicy { kZeroInitialize, kDontInitialize };
 
@@ -93,7 +177,9 @@
   void CopyTo(ArrayBufferContents& other);
 
   static void* AllocateMemoryOrNull(size_t, InitializationPolicy);
+  static void* ReserveMemory(size_t);
   static void FreeMemory(void*);
+  static void ReleaseReservedMemory(void*, size_t);
   static DataHandle CreateDataHandle(size_t, InitializationPolicy);
   static void Initialize(
       AdjustAmountOfExternalAllocatedMemoryFunction function) {
@@ -132,8 +218,8 @@
     void Adopt(DataHandle, unsigned size_in_bytes, SharingType is_shared);
     void CopyMemoryFrom(const DataHolder& source);
 
-    const void* Data() const { return data_.get(); }
-    void* Data() { return data_.get(); }
+    const void* Data() const { return data_.Data(); }
+    void* Data() { return data_.Data(); }
     unsigned SizeInBytes() const { return size_in_bytes_; }
     bool IsShared() const { return is_shared_ == kShared; }
 
diff --git a/third_party/WebKit/Source/web/tests/WebFrameTest.cpp b/third_party/WebKit/Source/web/tests/WebFrameTest.cpp
index 769d51c8..6195ebd 100644
--- a/third_party/WebKit/Source/web/tests/WebFrameTest.cpp
+++ b/third_party/WebKit/Source/web/tests/WebFrameTest.cpp
@@ -11045,7 +11045,7 @@
   document->GetFrame()->GetEventHandler().HandleMousePressEvent(
       mouse_press_event);
 
-  EXPECT_TRUE(document->ActiveHoverElement());
+  EXPECT_TRUE(document->GetActiveElement());
   EXPECT_TRUE(document->HoverElement());
 
   WebMouseEvent mouse_release_event(
@@ -11080,7 +11080,7 @@
   document->GetFrame()->GetEventHandler().HandleMousePressEvent(
       mouse_press_event);
 
-  EXPECT_TRUE(document->ActiveHoverElement());
+  EXPECT_TRUE(document->GetActiveElement());
   EXPECT_TRUE(document->HoverElement());
 
   document->GetFrame()->GetEventHandler().HandleMouseReleaseEvent(
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer.py b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer.py
index 05fae4c5..64f15942 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer.py
@@ -347,6 +347,8 @@
             '--gerrit',
             '-m',
             description,
+            '--tbrs',
+            'qyearsley@chromium.org',
         ] + self._cc_part(directory_owners))
 
     def _upload_patchset(self, message):
@@ -388,7 +390,6 @@
 
         if directory_owners:
             description += self._format_directory_owners(directory_owners) + '\n\n'
-        description += 'TBR: qyearsley@chromium.org\n'
 
         # Move any No-Export tag to the end of the description.
         description = description.replace('No-Export: true', '')
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer_unittest.py b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer_unittest.py
index 962b05c..0cc9e8e 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer_unittest.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer_unittest.py
@@ -199,7 +199,6 @@
             'lines to TestExpectations rather than reverting. See:\n'
             'https://chromium.googlesource.com'
             '/chromium/src/+/master/docs/testing/web_platform_tests.md\n\n'
-            'TBR: qyearsley@chromium.org\n'
             'No-Export: true')
         self.assertEqual(host.executive.calls, [['git', 'log', '-1', '--format=%B']])
 
@@ -222,7 +221,6 @@
         importer = TestImporter(host)
         description = importer._cl_description(directory_owners={})
         self.assertIn(
-            'TBR: qyearsley@chromium.org\n'
             'No-Export: true',
             description)
 
diff --git a/third_party/WebKit/public/platform/WebSourceBufferClient.h b/third_party/WebKit/public/platform/WebSourceBufferClient.h
index dcccab8..9cdf5c1 100644
--- a/third_party/WebKit/public/platform/WebSourceBufferClient.h
+++ b/third_party/WebKit/public/platform/WebSourceBufferClient.h
@@ -15,6 +15,9 @@
 // extensions module.
 class WebSourceBufferClient {
  public:
+  // Parser notification types used to monitor problematic usage.
+  enum ParseWarning { kKeyframeTimeGreaterThanDependant, kMuxedSequenceMode };
+
   virtual ~WebSourceBufferClient() {}
 
   // Complete media track info: track type, unique track id, kind, label,
@@ -34,6 +37,9 @@
   // case of success.
   virtual bool InitializationSegmentReceived(
       const WebVector<MediaTrackInfo>& tracks) = 0;
+
+  // Notifies SourceBuffer of parse warning.
+  virtual void NotifyParseWarning(const ParseWarning) = 0;
 };
 
 }  // namespace blink
diff --git a/third_party/WebKit/public/platform/modules/presentation/WebPresentationClient.h b/third_party/WebKit/public/platform/modules/presentation/WebPresentationClient.h
index 175bfedd..72a04df 100644
--- a/third_party/WebKit/public/platform/modules/presentation/WebPresentationClient.h
+++ b/third_party/WebKit/public/platform/modules/presentation/WebPresentationClient.h
@@ -54,38 +54,6 @@
   virtual void TerminatePresentation(const WebURL& presentation_url,
                                      const WebString& presentation_id) = 0;
 
-  // Called when the frame requests to send String message to a presentation
-  // via a presentation connection.
-  // |proxy|: proxy of Blink connection object initiating send String message
-  //          request. Does not pass ownership.
-  virtual void SendString(const WebURL& presentation_url,
-                          const WebString& presentation_id,
-                          const WebString& message,
-                          const WebPresentationConnectionProxy*) = 0;
-
-  // Called when the frame requests to send ArrayBuffer/View data to a
-  // presentation via a presentation connection.
-  // Embedder copies the |data| and the ownership is not transferred.
-  // |proxy|: proxy of Blink connection object initiating send ArrayBuffer
-  //          request. Does not pass ownership.
-  virtual void SendArrayBuffer(const WebURL& presentation_url,
-                               const WebString& presentation_id,
-                               const uint8_t* data,
-                               size_t length,
-                               const WebPresentationConnectionProxy*) = 0;
-
-  // Called when the frame requests to send Blob data to a presentation via a
-  // presentation connection.
-  // TODO(mfoltz): Combine with sendArrayBuffer?
-  // Embedder copies the |data| and the ownership is not transferred.
-  // |proxy|: proxy of blink connection object initiating send Blob data
-  //          request. Does not pass ownership.
-  virtual void SendBlobData(const WebURL& presentation_url,
-                            const WebString& presentation_id,
-                            const uint8_t* data,
-                            size_t length,
-                            const WebPresentationConnectionProxy*) = 0;
-
   // Called when the frame requests to close its connection to the presentation.
   virtual void CloseConnection(const WebURL& presentation_url,
                                const WebString& presentation_id,
diff --git a/third_party/WebKit/public/platform/modules/presentation/WebPresentationConnectionProxy.h b/third_party/WebKit/public/platform/modules/presentation/WebPresentationConnectionProxy.h
index 64f3e6e..3e16baaf 100644
--- a/third_party/WebKit/public/platform/modules/presentation/WebPresentationConnectionProxy.h
+++ b/third_party/WebKit/public/platform/modules/presentation/WebPresentationConnectionProxy.h
@@ -8,19 +8,24 @@
 namespace blink {
 
 enum class WebPresentationConnectionState;
+class WebString;
 
 // The implementation the embedder has to provide for the Presentation API to
-// work. This class is used to send messages to a PresentationConnection hosted
-// in a different frame.
+// work. This class is used to send messages to a remote PresentationConnection
+// (the "target"), which may be hosted in a different process.
 class WebPresentationConnectionProxy {
  public:
   virtual ~WebPresentationConnectionProxy() = default;
 
-  // Close target connection.
+  // Closes the target connection.
   virtual void Close() const = 0;
 
-  // Notify target connection about connection state change.
+  // Notifies the target connection about connection state change.
   virtual void NotifyTargetConnection(WebPresentationConnectionState) = 0;
+
+  // Sends a text or binary message to the target connection.
+  virtual void SendTextMessage(const WebString& message) = 0;
+  virtual void SendBinaryMessage(const uint8_t* data, size_t length) = 0;
 };
 
 }  // namespace blink
diff --git a/third_party/WebKit/public/platform/modules/presentation/WebPresentationController.h b/third_party/WebKit/public/platform/modules/presentation/WebPresentationController.h
index a8925e5..c20ec03 100644
--- a/third_party/WebKit/public/platform/modules/presentation/WebPresentationController.h
+++ b/third_party/WebKit/public/platform/modules/presentation/WebPresentationController.h
@@ -44,15 +44,6 @@
   virtual void DidCloseConnection(const WebPresentationInfo&,
                                   WebPresentationConnectionCloseReason,
                                   const WebString& message) = 0;
-
-  // Called when a text message is received from the presentation.
-  virtual void DidReceiveConnectionTextMessage(const WebPresentationInfo&,
-                                               const WebString& message) = 0;
-
-  // Called when a binary message is received from the presentation.
-  virtual void DidReceiveConnectionBinaryMessage(const WebPresentationInfo&,
-                                                 const uint8_t* data,
-                                                 size_t length) = 0;
 };
 
 }  // namespace blink
diff --git a/third_party/WebKit/public/platform/web_feature.mojom b/third_party/WebKit/public/platform/web_feature.mojom
index 7a1b51ef..6f4ef2c 100644
--- a/third_party/WebKit/public/platform/web_feature.mojom
+++ b/third_party/WebKit/public/platform/web_feature.mojom
@@ -1595,6 +1595,8 @@
   kGetUserMediaMicDisallowedByFeaturePolicyInCrossOriginIframe = 2057,
   kGetUserMediaCameraDisallowedByFeaturePolicyInCrossOriginIframe = 2058,
   kRequestMIDIAccessDisallowedByFeaturePolicyInCrossOriginIframe = 2059,
+  kMediaSourceKeyframeTimeGreaterThanDependant = 2060,
+  kMediaSourceMuxedSequenceMode = 2061,
 
   // Add new features immediately above this line. Don't change assigned
   // numbers of any item, and don't reuse removed slots.
diff --git a/third_party/closure_compiler/run_compiler b/third_party/closure_compiler/run_compiler
index 69e5263..10f5609f 100755
--- a/third_party/closure_compiler/run_compiler
+++ b/third_party/closure_compiler/run_compiler
@@ -12,4 +12,11 @@
 
 tools/gyp/gyp --no-circular-check third_party/closure_compiler/compiled_resources2.gyp
 
-ninja -C out/Default -j `nproc` $@
+os_name=`uname -s`
+cores_count=1
+case "$os_name" in
+  "Darwin") cores_count=`sysctl -n hw.ncpu` ;;
+  "Linux") cores_count=`nproc` ;;
+esac
+
+ninja -C out/Default -j $cores_count $@
diff --git a/third_party/gvr-android-sdk/native_callbacks_jni.h b/third_party/gvr-android-sdk/native_callbacks_jni.h
index 96a4b59..8f9e0dac 100644
--- a/third_party/gvr-android-sdk/native_callbacks_jni.h
+++ b/third_party/gvr-android-sdk/native_callbacks_jni.h
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// This file is autogenerated by
+// This file is of the same format as file that generated by
 //     base/android/jni_generator/jni_generator.py
 // For
 //     com/google/vr/internal/controller/NativeCallbacks
diff --git a/tools/gn/bootstrap/bootstrap.py b/tools/gn/bootstrap/bootstrap.py
index 0721c68..8beca90 100755
--- a/tools/gn/bootstrap/bootstrap.py
+++ b/tools/gn/bootstrap/bootstrap.py
@@ -549,7 +549,6 @@
       'base/trace_event/memory_dump_scheduler.cc',
       'base/trace_event/memory_infra_background_whitelist.cc',
       'base/trace_event/memory_peak_detector.cc',
-      'base/trace_event/memory_tracing_observer.cc',
       'base/trace_event/memory_usage_estimator.cc',
       'base/trace_event/process_memory_dump.cc',
       'base/trace_event/process_memory_maps.cc',
diff --git a/tools/gn/bundle_data.h b/tools/gn/bundle_data.h
index 4ea1499e..26c972c0 100644
--- a/tools/gn/bundle_data.h
+++ b/tools/gn/bundle_data.h
@@ -107,6 +107,13 @@
   std::string& product_type() { return product_type_; }
   const std::string& product_type() const { return product_type_; }
 
+  std::string& xcode_test_application_name() {
+    return xcode_test_application_name_;
+  }
+  const std::string& xcode_test_application_name() const {
+    return xcode_test_application_name_;
+  }
+
   void set_code_signing_script(const SourceFile& script_file) {
     code_signing_script_ = script_file;
   }
@@ -161,6 +168,11 @@
   // the Xcode project file when using --ide=xcode.
   std::string product_type_;
 
+  // Each Xcode unit test or ui test target must have a test application target,
+  // and this value corresponds to the target name. This is only used to
+  // generate the Xcode project when using --ide=xcode.
+  std::string xcode_test_application_name_;
+
   // Holds the values (script name, sources, outputs, script arguments) for the
   // code signing step if defined.
   SourceFile code_signing_script_;
diff --git a/tools/gn/create_bundle_target_generator.cc b/tools/gn/create_bundle_target_generator.cc
index fca4f2a..22c6cd6 100644
--- a/tools/gn/create_bundle_target_generator.cc
+++ b/tools/gn/create_bundle_target_generator.cc
@@ -49,6 +49,9 @@
   if (!FillProductType())
     return;
 
+  if (!FillXcodeTestApplicationName())
+    return;
+
   if (!FillCodeSigningScript())
     return;
 
@@ -134,6 +137,20 @@
   return true;
 }
 
+bool CreateBundleTargetGenerator::FillXcodeTestApplicationName() {
+  const Value* value =
+      scope_->GetValue(variables::kXcodeTestApplicationName, true);
+  if (!value)
+    return true;
+
+  if (!value->VerifyTypeIs(Value::STRING, err_))
+    return false;
+
+  target_->bundle_data().xcode_test_application_name().assign(
+      value->string_value());
+  return true;
+}
+
 bool CreateBundleTargetGenerator::FillCodeSigningScript() {
   const Value* value = scope_->GetValue(variables::kCodeSigningScript, true);
   if (!value)
diff --git a/tools/gn/create_bundle_target_generator.h b/tools/gn/create_bundle_target_generator.h
index 4fdfcd2..bf2ad2f 100644
--- a/tools/gn/create_bundle_target_generator.h
+++ b/tools/gn/create_bundle_target_generator.h
@@ -30,6 +30,7 @@
   bool FillXcodeExtraAttributes();
 
   bool FillProductType();
+  bool FillXcodeTestApplicationName();
 
   bool FillCodeSigningScript();
   bool FillCodeSigningSources();
diff --git a/tools/gn/docs/reference.md b/tools/gn/docs/reference.md
index f381f74..da9cd1c 100644
--- a/tools/gn/docs/reference.md
+++ b/tools/gn/docs/reference.md
@@ -124,6 +124,7 @@
     *   [response_file_contents: [string list] Contents of .rsp file for actions.](#response_file_contents)
     *   [script: [file name] Script file for actions.](#script)
     *   [sources: [file list] Source files for a target.](#sources)
+    *   [xcode_test_application_name: [string] Xcode test application name for unit or ui test.](#xcode_test_application_name)
     *   [testonly: [boolean] Declares a target must only be used for testing.](#testonly)
     *   [visibility: [label list] A list of labels that can depend on a target.](#visibility)
     *   [write_runtime_deps: Writes the target's runtime_deps to the given path.](#write_runtime_deps)
@@ -5206,6 +5207,24 @@
   copy
     The source are the source files to copy.
 ```
+### <a name="xcode_test_application_name"></a>**xcode_test_application_name**: Xcode test application name for unit or ui test target.
+
+```
+  Each Xcode unit and ui test target must have a test application target, and
+  this value is used to specify the relationship. Only meaningful to Xcode
+  (used as part of the Xcode project generation).
+
+  See "gn help create_bundle" for more information.
+```
+
+#### **Example**
+
+```
+  create_bundle("chrome_xctest") {
+    xcode_test_application_name = "chrome"
+    ...
+  }
+```
 ### <a name="testonly"></a>**testonly**: Declares a target must only be used for testing.
 
 ```
diff --git a/tools/gn/functions_target.cc b/tools/gn/functions_target.cc
index cd58ff19..f4369d63 100644
--- a/tools/gn/functions_target.cc
+++ b/tools/gn/functions_target.cc
@@ -361,7 +361,8 @@
   bundle_root_dir*, bundle_resources_dir*, bundle_executable_dir*,
   bundle_plugins_dir*, bundle_deps_filter, deps, data_deps, public_deps,
   visibility, product_type, code_signing_args, code_signing_script,
-  code_signing_sources, code_signing_outputs, extra_attributes
+  code_signing_sources, code_signing_outputs, xcode_extra_attributes,
+  xcode_test_application_name
   * = required
 
 Example
diff --git a/tools/gn/variables.cc b/tools/gn/variables.cc
index eb69a18..5b80181 100644
--- a/tools/gn/variables.cc
+++ b/tools/gn/variables.cc
@@ -1746,6 +1746,27 @@
     The source are the source files to copy.
 )";
 
+const char kXcodeTestApplicationName[] = "xcode_test_application_name";
+const char kXcodeTestApplicationName_HelpShort[] =
+    "test_application_name: [string] Test application name for unit or ui test "
+    "target.";
+const char kXcodeTestApplicationName_Help[] =
+    R"(test_application_name: Test application name for unit or ui test target.
+
+  Each unit and ui test target must have a test application target, and this
+  value is used to specify the relationship. Only meaningful to Xcode (used as
+  part of the Xcode project generation).
+
+  See "gn help create_bundle" for more information.
+
+Exmaple
+
+  create_bundle("chrome_xctest") {
+    test_application_name = "chrome"
+    ...
+  }
+)";
+
 const char kTestonly[] = "testonly";
 const char kTestonly_HelpShort[] =
     "testonly: [boolean] Declares a target must only be used for testing.";
@@ -1939,6 +1960,7 @@
     INSERT_VARIABLE(ResponseFileContents)
     INSERT_VARIABLE(Script)
     INSERT_VARIABLE(Sources)
+    INSERT_VARIABLE(XcodeTestApplicationName)
     INSERT_VARIABLE(Testonly)
     INSERT_VARIABLE(Visibility)
     INSERT_VARIABLE(WriteRuntimeDeps)
diff --git a/tools/gn/variables.h b/tools/gn/variables.h
index 2d2e0c7..0ea00d54 100644
--- a/tools/gn/variables.h
+++ b/tools/gn/variables.h
@@ -279,6 +279,10 @@
 extern const char kSources_HelpShort[];
 extern const char kSources_Help[];
 
+extern const char kXcodeTestApplicationName[];
+extern const char kXcodeTestApplicationName_HelpShort[];
+extern const char kXcodeTestApplicationName_Help[];
+
 extern const char kTestonly[];
 extern const char kTestonly_HelpShort[];
 extern const char kTestonly_Help[];
diff --git a/tools/gn/xcode_writer.cc b/tools/gn/xcode_writer.cc
index 3128e6c..fbcc069 100644
--- a/tools/gn/xcode_writer.cc
+++ b/tools/gn/xcode_writer.cc
@@ -131,6 +131,8 @@
                         base::CompareCase::SENSITIVE);
 }
 
+// TODO(crbug.com/741147) Remove this function and switch to use
+// test_application_name once the bug is fixed and GN has rolled past it.
 const Target* FindXCTestApplicationTarget(
     const Target* xctest_module_target,
     const std::vector<const Target*>& targets) {
@@ -151,6 +153,8 @@
   return nullptr;
 }
 
+// TODO(crbug.com/741147) Remove this function and switch to use
+// test_application_name once the bug is fixed and GN has rolled past it.
 // Given XCTest module targets, find the corresponding application targets and
 // the mappings between them.
 void FindXCTestApplicationTargets(
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index da63436..da01bc4 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -15788,6 +15788,8 @@
       label="GetUserMediaCameraDisallowedByFeaturePolicyInCrossOriginIframe"/>
   <int value="2059"
       label="RequestMIDIAccessDisallowedByFeaturePolicyInCrossOriginIframe"/>
+  <int value="2060" label="MediaSourceKeyframeTimeGreaterThanDependant"/>
+  <int value="2061" label="MediaSourceMuxedSequenceMode"/>
 </enum>
 
 <enum name="FeedbackSource">
@@ -18975,19 +18977,47 @@
 </enum>
 
 <enum name="HistogramNameHash">
+  <int value="-2055973512" label="Login.ConsumerNewUsersAllowed"/>
+  <int value="-2021219906"
+      label="DataUse.MessageSize.AllServices.Downstream.Foreground.NotCellular"/>
+  <int value="-1620411628"
+      label="DataUse.MessageSize.AllServices.Downstream.Unknown.NotCellular"/>
+  <int value="-1607339868"
+      label="DataUse.MessageSize.AllServices.Upstream.Unknown.NotCellular"/>
+  <int value="-1390672863"
+      label="DataUse.MessageSize.AllServices.Upstream.Background.NotCellular"/>
+  <int value="-1286300074"
+      label="Network.Shill.Wifi.ExpiredLeaseLengthSeconds"/>
+  <int value="-847447887"
+      label="DataUse.MessageSize.AllServices.Upstream.Foreground.NotCellular"/>
   <summary>
     These numbers are the lower 32 bits of the hash of the metric name.
   </summary>
-  <int value="-2055973512" label="Login.ConsumerNewUsersAllowed"/>
-  <int value="-1286300074"
-      label="Network.Shill.Wifi.ExpiredLeaseLengthSeconds"/>
+  <int value="-742109866" label="Stability.BrowserExitCodes"/>
+  <int value="-657514887" label="DataUse.MessageSize.AllServices"/>
+  <int value="-535820174"
+      label="DataUse.MessageSize.AllServices.Downstream.Background.NotCellular"/>
+  <int value="-355731177" label="UMA.SamplingRatePerMille"/>
+  <int value="-141990989" label="DataUse.AllServices.Background"/>
   <int value="0" label="Missing hash value"/>
+  <int value="149985012"
+      label="DataUse.MessageSize.AllServices.Upstream.Unknown.Cellular"/>
+  <int value="192918458"
+      label="DataUse.MessageSize.AllServices.Downstream.Unknown.Cellular"/>
   <int value="424952287"
       label="Network.Shill.Wifi.LinkMonitorResponseTimeSample"/>
   <int value="628921860"
       label="Network.Shill.Ethernet.LinkMonitorResponseTimeSample"/>
   <int value="662206917"
       label="Network.Shill.Ethernet.ExpiredLeaseLengthSeconds"/>
+  <int value="757405826"
+      label="DataUse.MessageSize.AllServices.Upstream.Foreground.Cellular"/>
+  <int value="1370064090"
+      label="DataUse.MessageSize.AllServices.Upstream.Background.Cellular"/>
+  <int value="1753226325"
+      label="DataUse.MessageSize.AllServices.Downstream.Foreground.Cellular"/>
+  <int value="1977321258"
+      label="DataUse.MessageSize.AllServices.Downstream.Background.Cellular"/>
 </enum>
 
 <enum name="HistoryFaviconsRecoveryEnum">
diff --git a/tools/metrics/rappor/rappor.xml b/tools/metrics/rappor/rappor.xml
index 903b3b3b..488e05b 100644
--- a/tools/metrics/rappor/rappor.xml
+++ b/tools/metrics/rappor/rappor.xml
@@ -1269,6 +1269,36 @@
   </summary>
 </rappor-metric>
 
+<rappor-metric name="Media.OriginUrl.MSE.KeyframeTimeGreaterThanDependant"
+    type="ETLD_PLUS_ONE">
+  <owner>wolenetz@chromium.org</owner>
+  <summary>
+    The domain and registry of the URL that loads an HTML5 media player using
+    Media Source Extensions (MSE) and supplies media containing a track
+    resulting in a sequence emitted from the coded frame processing algorithm
+    where a nonkeyframe's presentation timestamp precedes the presentation
+    timestamp of the keyframe needed to decode it. This is reported up to once
+    per track, so multiple reports may come from a single playback. See
+    https://crbug.com/739931 for more context on why such sequences may be
+    problematic.
+  </summary>
+</rappor-metric>
+
+<rappor-metric name="Media.OriginUrl.MSE.MuxedSequenceModeSourceBuffer"
+    type="ETLD_PLUS_ONE">
+  <owner>wolenetz@chromium.org</owner>
+  <summary>
+    The domain and registry of the URL that loads an HTML5 media player using
+    Media Source Extensions (MSE) and appends a media segment to a multitrack
+    SourceBuffer that is using 'sequence' AppendMode. This usage frequently
+    results in surprising and undesirable results, usually due to automatic
+    timestampOffset updates based on one track after a discontinuity are applied
+    to all tracks. This is reported up to once per SourceBuffer, so multiple
+    reports may come from a single playback. See https://crbug.com/737757 for
+    more context.
+  </summary>
+</rappor-metric>
+
 <rappor-metric name="Media.OriginUrl.MSE.PipelineError" type="ETLD_PLUS_ONE">
   <owner>xhwang@chromium.org</owner>
   <summary>
diff --git a/tools/perf/benchmark.csv b/tools/perf/benchmark.csv
index 767f75a..d5cb843 100644
--- a/tools/perf/benchmark.csv
+++ b/tools/perf/benchmark.csv
@@ -52,10 +52,7 @@
 power.steady_state,,
 power.trivial_pages,erikchen@chromium.org,
 power.typical_10_mobile,perezju@chromium.org,
-rasterize_and_record_micro.key_mobile_sites,,
-rasterize_and_record_micro.key_silk_cases,vmpstr@chromium.org,
 rasterize_and_record_micro.partial_invalidation,,
-rasterize_and_record_micro.polymer,,
 rasterize_and_record_micro.top_25,,
 resource_sizes,"agrieve@chromium.org, rnephew@chromium.org, perezju@chromium.org",
 scheduler.tough_scheduling_cases,"skyostil@chromium.org, brianderson@chromium.org",
diff --git a/tools/perf/benchmarks/rasterize_and_record_micro.py b/tools/perf/benchmarks/rasterize_and_record_micro.py
index c927b0c0..4a077d7 100644
--- a/tools/perf/benchmarks/rasterize_and_record_micro.py
+++ b/tools/perf/benchmarks/rasterize_and_record_micro.py
@@ -61,56 +61,6 @@
     return page_sets.Top25StoryExpectations()
 
 
-@benchmark.Disabled('all')  # http://crbug.com/531597
-class RasterizeAndRecordMicroKeyMobileSites(_RasterizeAndRecordMicro):
-  """Measures rasterize and record performance on the key mobile sites.
-
-  http://www.chromium.org/developers/design-documents/rendering-benchmarks"""
-  page_set = page_sets.KeyMobileSitesPageSet
-
-  @classmethod
-  def Name(cls):
-    return 'rasterize_and_record_micro.key_mobile_sites'
-
-  def GetExpectations(self):
-    return page_sets.KeyMobileSitesStoryExpectations()
-
-
-@benchmark.Disabled('all') # http://crbug.com/610424
-@benchmark.Owner(emails=['vmpstr@chromium.org'])
-class RasterizeAndRecordMicroKeySilkCases(_RasterizeAndRecordMicro):
-  """Measures rasterize and record performance on the silk sites.
-
-  http://www.chromium.org/developers/design-documents/rendering-benchmarks"""
-
-  @classmethod
-  def Name(cls):
-    return 'rasterize_and_record_micro.key_silk_cases'
-
-  def CreateStorySet(self, options):
-    return page_sets.KeySilkCasesPageSet(run_no_page_interactions=True)
-
-  def GetExpectations(self):
-    return page_sets.KeySilkCasesStoryExpectations()
-
-
-@benchmark.Disabled('all')  # http://crbug.com/709561
-class RasterizeAndRecordMicroPolymer(_RasterizeAndRecordMicro):
-  """Measures rasterize and record performance on the Polymer cases.
-
-  http://www.chromium.org/developers/design-documents/rendering-benchmarks"""
-
-  @classmethod
-  def Name(cls):
-    return 'rasterize_and_record_micro.polymer'
-
-  def CreateStorySet(self, options):
-    return page_sets.PolymerPageSet(run_no_page_interactions=True)
-
-  def GetExpectations(self):
-    return page_sets.PolymerRasterizeAndRecordStoryExpectations()
-
-
 # New benchmark only enabled on Linux until we've observed behavior for a
 # reasonable period of time.
 @benchmark.Disabled('mac', 'win', 'android')
diff --git a/tools/perf/contrib/vr_benchmarks/BUILD.gn b/tools/perf/contrib/vr_benchmarks/BUILD.gn
index c3ee382..065e2d3 100644
--- a/tools/perf/contrib/vr_benchmarks/BUILD.gn
+++ b/tools/perf/contrib/vr_benchmarks/BUILD.gn
@@ -2,6 +2,8 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+assert(is_android)
+
 group("vr_perf_tests") {
   testonly = true
   data = [
diff --git a/tools/perf/core/perf_data_generator.py b/tools/perf/core/perf_data_generator.py
index 06b3c16..9752d21a 100755
--- a/tools/perf/core/perf_data_generator.py
+++ b/tools/perf/core/perf_data_generator.py
@@ -99,29 +99,6 @@
          ('tracing_perftests', 'build137-b1')]
       }
     ])
-  waterfall = add_tester(
-    waterfall, 'Android Swarming N5X Tester',
-    'fyi-android-swarming-n5x', 'android',
-    swarming=[
-      {
-       'os': 'Android',
-       'android_devices': '1',
-       'pool': 'Chrome-perf-fyi',
-       'device_ids': [
-           'build245-m4--device1', 'build245-m4--device2',
-           'build245-m4--device3', 'build245-m4--device4',
-           'build245-m4--device5', 'build245-m4--device6',
-           'build245-m4--device7', 'build248-m4--device1',
-           'build248-m4--device2', 'build248-m4--device3',
-           'build248-m4--device4', 'build248-m4--device5',
-           'build248-m4--device6', 'build248-m4--device7',
-           'build249-m4--device1', 'build249-m4--device2',
-           'build249-m4--device3', 'build249-m4--device4',
-           'build249-m4--device5', 'build249-m4--device6',
-           'build249-m4--device7'
-        ]
-      }
-    ])
 
   return waterfall
 
@@ -838,7 +815,7 @@
     tests[name] = config
 
   tests['AAAAA1 AUTOGENERATED FILE DO NOT EDIT'] = {}
-  tests['AAAAA2 See //tools/perf/generate_perf_data.py to make changes'] = {}
+  tests['AAAAA2 See //tools/perf/generate_perf_data to make changes'] = {}
   return tests
 
 
diff --git a/tools/perf/unowned_benchmarks.txt b/tools/perf/unowned_benchmarks.txt
index 63491c8..668800c 100644
--- a/tools/perf/unowned_benchmarks.txt
+++ b/tools/perf/unowned_benchmarks.txt
@@ -2,9 +2,7 @@
 load_library_perf_tests
 power.idle_platform
 power.steady_state
-rasterize_and_record_micro.key_mobile_sites
 rasterize_and_record_micro.partial_invalidation
-rasterize_and_record_micro.polymer
 rasterize_and_record_micro.top_25
 smoothness.tough_image_decode_cases
 start_with_ext.cold.blank_page
diff --git a/ui/android/delegated_frame_host_android.cc b/ui/android/delegated_frame_host_android.cc
index 6753f4b..95b4fb5 100644
--- a/ui/android/delegated_frame_host_android.cc
+++ b/ui/android/delegated_frame_host_android.cc
@@ -11,9 +11,9 @@
 #include "cc/layers/surface_layer.h"
 #include "cc/output/compositor_frame.h"
 #include "cc/output/copy_output_result.h"
-#include "cc/surfaces/frame_sink_manager.h"
 #include "cc/surfaces/surface.h"
 #include "components/viz/common/surfaces/surface_id.h"
+#include "components/viz/service/frame_sinks/frame_sink_manager.h"
 #include "ui/android/view_android.h"
 #include "ui/android/window_android_compositor.h"
 #include "ui/display/display.h"
@@ -51,7 +51,7 @@
 
 DelegatedFrameHostAndroid::DelegatedFrameHostAndroid(
     ui::ViewAndroid* view,
-    cc::FrameSinkManager* frame_sink_manager,
+    viz::FrameSinkManager* frame_sink_manager,
     Client* client,
     const viz::FrameSinkId& frame_sink_id)
     : frame_sink_id_(frame_sink_id),
diff --git a/ui/android/delegated_frame_host_android.h b/ui/android/delegated_frame_host_android.h
index 2428a23..25fbcdc 100644
--- a/ui/android/delegated_frame_host_android.h
+++ b/ui/android/delegated_frame_host_android.h
@@ -40,7 +40,7 @@
   };
 
   DelegatedFrameHostAndroid(ViewAndroid* view,
-                            cc::FrameSinkManager* frame_sink_manager,
+                            viz::FrameSinkManager* frame_sink_manager,
                             Client* client,
                             const viz::FrameSinkId& frame_sink_id);
 
@@ -91,7 +91,7 @@
 
   ViewAndroid* view_;
 
-  cc::FrameSinkManager* const frame_sink_manager_;
+  viz::FrameSinkManager* const frame_sink_manager_;
   WindowAndroidCompositor* registered_parent_compositor_ = nullptr;
   Client* client_;
 
diff --git a/ui/app_list/views/apps_grid_view.cc b/ui/app_list/views/apps_grid_view.cc
index a7b17755..9c2d47a 100644
--- a/ui/app_list/views/apps_grid_view.cc
+++ b/ui/app_list/views/apps_grid_view.cc
@@ -1342,13 +1342,10 @@
   // could have integer round error and causes jitter.
   *drag_point = event.root_location();
 
-  // GetWidget() could be NULL for tests.
-  if (GetWidget()) {
-    aura::Window::ConvertPointToTarget(
-        GetWidget()->GetNativeWindow()->GetRootWindow(),
-        GetWidget()->GetNativeWindow(), drag_point);
-  }
-
+  DCHECK(GetWidget());
+  aura::Window::ConvertPointToTarget(
+      GetWidget()->GetNativeWindow()->GetRootWindow(),
+      GetWidget()->GetNativeWindow(), drag_point);
   views::View::ConvertPointFromWidget(this, drag_point);
 }
 
@@ -2101,11 +2098,19 @@
 AppsGridView::Index AppsGridView::GetNearestTileIndexForPoint(
     const gfx::Point& point) const {
   gfx::Rect bounds = GetContentsBounds();
+  bounds.Inset(0, GetHeightOnTopOfAllAppsTiles(), 0, 0);
   const gfx::Size total_tile_size = GetTotalTileSize();
   int col = ClampToRange((point.x() - bounds.x()) / total_tile_size.width(), 0,
                          cols_ - 1);
-  int row = ClampToRange((point.y() - bounds.y()) / total_tile_size.height(), 0,
-                         rows_per_page_ - 1);
+  int row = rows_per_page_;
+  if (is_fullscreen_app_list_enabled_ &&
+      pagination_model_.selected_page() == 0) {
+    row = ClampToRange((point.y() - bounds.y()) / total_tile_size.height(), 0,
+                       rows_per_page_ - 2);
+  } else {
+    row = ClampToRange((point.y() - bounds.y()) / total_tile_size.height(), 0,
+                       rows_per_page_ - 1);
+  }
   return Index(pagination_model_.selected_page(), row * cols_ + col);
 }
 
diff --git a/ui/app_list/views/apps_grid_view_unittest.cc b/ui/app_list/views/apps_grid_view_unittest.cc
index 6abf67b..f8563c3e 100644
--- a/ui/app_list/views/apps_grid_view_unittest.cc
+++ b/ui/app_list/views/apps_grid_view_unittest.cc
@@ -122,11 +122,14 @@
     delegate_.reset(new AppListTestViewDelegate);
     app_list_view_ = new AppListView(delegate_.get());
 
-    // Initialize around a point that ensures the window is wholly shown.
     app_list_view_->Initialize(parent, 0, false, false);
     ContentsView* contents_view =
         app_list_view_->app_list_main_view()->contents_view();
     apps_grid_view_ = contents_view->apps_container_view()->apps_grid_view();
+    // Initialize around a point that ensures the window is wholly shown. It
+    // bails out early with |test_with_fullscreen_|.
+    // TODO(warx): remove MaybeSetAnchorPoint setup here when bubble launcher is
+    // removed from code base.
     gfx::Size size = apps_grid_view_->GetPreferredSize();
     app_list_view_->MaybeSetAnchorPoint(
         gfx::Point(size.width() / 2, size.height() / 2));
@@ -319,7 +322,7 @@
   EXPECT_TRUE(apps_grid_view_->IsSelectedView(view));
 }
 
-TEST_F(AppsGridViewTest, MouseDragWithFolderDisabled) {
+TEST_P(AppsGridViewTest, MouseDragWithFolderDisabled) {
   model_->SetFoldersEnabled(false);
   const int kTotalItems = 4;
   model_->PopulateApps(kTotalItems);
@@ -368,7 +371,7 @@
   test_api_->LayoutToIdealBounds();
 }
 
-TEST_F(AppsGridViewTest, MouseDragItemIntoFolder) {
+TEST_P(AppsGridViewTest, MouseDragItemIntoFolder) {
   size_t kTotalItems = 3;
   model_->PopulateApps(kTotalItems);
   EXPECT_EQ(model_->top_level_item_list()->item_count(), kTotalItems);
@@ -415,7 +418,7 @@
   test_api_->LayoutToIdealBounds();
 }
 
-TEST_F(AppsGridViewTest, MouseDragMaxItemsInFolder) {
+TEST_P(AppsGridViewTest, MouseDragMaxItemsInFolder) {
   // Create and add a folder with 15 items in it.
   size_t kTotalItems = kMaxFolderItems - 1;
   model_->CreateAndPopulateFolderWithApps(kTotalItems);
@@ -460,7 +463,7 @@
 
 // Check that moving items around doesn't allow a drop to happen into a full
 // folder.
-TEST_F(AppsGridViewTest, MouseDragMaxItemsInFolderWithMovement) {
+TEST_P(AppsGridViewTest, MouseDragMaxItemsInFolderWithMovement) {
   // Create and add a folder with 16 items in it.
   size_t kTotalItems = kMaxFolderItems;
   model_->CreateAndPopulateFolderWithApps(kTotalItems);
@@ -509,9 +512,11 @@
   test_api_->LayoutToIdealBounds();
 }
 
-TEST_F(AppsGridViewTest, MouseDragItemReorder) {
-  // Using a simulated 2x2 layout for the test.
-  apps_grid_view_->SetLayout(2, 2);
+TEST_P(AppsGridViewTest, MouseDragItemReorder) {
+  // Using a simulated 2x2 layout for the test. If fullscreen app list is
+  // enabled, rows_per_page passed should be 3 as the first row is occupied by
+  // suggested apps.
+  apps_grid_view_->SetLayout(2, test_with_fullscreen_ ? 3 : 2);
   model_->PopulateApps(4);
   EXPECT_EQ(4u, model_->top_level_item_list()->item_count());
   EXPECT_EQ(std::string("Item 0,Item 1,Item 2,Item 3"),
@@ -574,7 +579,7 @@
             model_->GetModelContent());
 }
 
-TEST_F(AppsGridViewTest, MouseDragFolderReorder) {
+TEST_P(AppsGridViewTest, MouseDragFolderReorder) {
   size_t kTotalItems = 2;
   model_->CreateAndPopulateFolderWithApps(kTotalItems);
   model_->PopulateAppWithId(kTotalItems);
@@ -631,6 +636,7 @@
   test_api_->LayoutToIdealBounds();
 }
 
+// TODO(warx): enable this test for |test_with_fullscreen_|, crbug.com/742581.
 TEST_F(AppsGridViewTest, MouseDragFlipPage) {
   test_api_->SetPageFlipDelay(10);
   GetPaginationModel()->SetTransitionDurations(10, 10);
@@ -674,7 +680,7 @@
   apps_grid_view_->EndDrag(true);
 }
 
-TEST_F(AppsGridViewTest, SimultaneousDragWithFolderDisabled) {
+TEST_P(AppsGridViewTest, SimultaneousDragWithFolderDisabled) {
   model_->SetFoldersEnabled(false);
   const int kTotalItems = 4;
   model_->PopulateApps(kTotalItems);
diff --git a/ui/app_list/views/contents_view.cc b/ui/app_list/views/contents_view.cc
index 6b092c1..0ab0ae3 100644
--- a/ui/app_list/views/contents_view.cc
+++ b/ui/app_list/views/contents_view.cc
@@ -214,7 +214,10 @@
   const bool folder_active = state == AppListModel::STATE_APPS &&
                              apps_container_view_->IsInFolderView();
 
-  if (!is_fullscreen_app_list_enabled_) {
+  if (is_fullscreen_app_list_enabled_) {
+    app_list_main_view_->search_box_view()->UpdateBackground(
+        state == AppListModel::STATE_SEARCH_RESULTS);
+  } else {
     app_list_main_view_->search_box_view()->back_button()->SetVisible(
         state != AppListModel::STATE_START);
     app_list_main_view_->search_box_view()->Layout();
diff --git a/ui/app_list/views/search_box_view.cc b/ui/app_list/views/search_box_view.cc
index f7af677..844aef68 100644
--- a/ui/app_list/views/search_box_view.cc
+++ b/ui/app_list/views/search_box_view.cc
@@ -10,6 +10,7 @@
 #include "base/memory/ptr_util.h"
 #include "build/build_config.h"
 #include "components/wallpaper/wallpaper_color_profile.h"
+#include "third_party/skia/include/core/SkPath.h"
 #include "ui/app_list/app_list_constants.h"
 #include "ui/app_list/app_list_features.h"
 #include "ui/app_list/app_list_model.h"
@@ -58,6 +59,7 @@
 
 constexpr int kBackgroundBorderCornerRadius = 2;
 constexpr int kBackgroundBorderCornerRadiusFullscreen = 24;
+constexpr int kBackgroundBorderCornerRadiusSearchResult = 4;
 constexpr int kGoogleIconSize = 24;
 constexpr int kMicIconSize = 24;
 
@@ -75,27 +77,46 @@
 // A background that paints a solid white rounded rect with a thin grey border.
 class SearchBoxBackground : public views::Background {
  public:
-  explicit SearchBoxBackground(SkColor color)
-      : background_border_corner_radius_(
-            features::IsFullscreenAppListEnabled()
-                ? kBackgroundBorderCornerRadiusFullscreen
-                : kBackgroundBorderCornerRadius),
-        color_(color) {}
+  explicit SearchBoxBackground(SkColor color) : color_(color) {
+    const int corner_radius = features::IsFullscreenAppListEnabled()
+                                  ? kBackgroundBorderCornerRadiusFullscreen
+                                  : kBackgroundBorderCornerRadius;
+    SetCornerRadius(corner_radius, corner_radius, corner_radius, corner_radius);
+  }
   ~SearchBoxBackground() override {}
 
+  void SetCornerRadius(int top_left,
+                       int top_right,
+                       int bottom_right,
+                       int bottom_left) {
+    DCHECK(top_left >= 0 && top_right >= 0 && bottom_right >= 0 &&
+           bottom_left >= 0);
+    corner_radius_[0] = top_left;
+    corner_radius_[1] = top_right;
+    corner_radius_[2] = bottom_right;
+    corner_radius_[3] = bottom_left;
+  }
+
  private:
   // views::Background overrides:
   void Paint(gfx::Canvas* canvas, views::View* view) const override {
     gfx::Rect bounds = view->GetContentsBounds();
 
+    const SkScalar kRadius[8] = {
+        SkIntToScalar(corner_radius_[0]), SkIntToScalar(corner_radius_[0]),
+        SkIntToScalar(corner_radius_[1]), SkIntToScalar(corner_radius_[1]),
+        SkIntToScalar(corner_radius_[2]), SkIntToScalar(corner_radius_[2]),
+        SkIntToScalar(corner_radius_[3]), SkIntToScalar(corner_radius_[3])};
+    SkPath path;
+    path.addRoundRect(gfx::RectToSkRect(bounds), kRadius);
     cc::PaintFlags flags;
     flags.setAntiAlias(true);
     flags.setColor(color_);
-    canvas->DrawRoundRect(bounds, background_border_corner_radius_, flags);
+    canvas->DrawPath(path, flags);
   }
 
-  const int background_border_corner_radius_;
-  const SkColor color_;
+  int corner_radius_[4];
+  SkColor color_;
 
   DISALLOW_COPY_AND_ASSIGN(SearchBoxBackground);
 };
@@ -434,6 +455,21 @@
   HandleSearchBoxEvent(event);
 }
 
+void SearchBoxView::UpdateBackground(bool search_results_state) {
+  if (!search_results_state) {
+    WallpaperProminentColorsChanged();
+    return;
+  }
+
+  SearchBoxBackground* background =
+      new SearchBoxBackground(kSearchBoxBackgroundDefault);
+  background->SetCornerRadius(kBackgroundBorderCornerRadiusSearchResult,
+                              kBackgroundBorderCornerRadiusSearchResult, 0, 0);
+  content_container_->SetBackground(
+      base::WrapUnique<SearchBoxBackground>(background));
+  search_box_->SetBackgroundColor(kSearchBoxBackgroundDefault);
+}
+
 void SearchBoxView::UpdateModel() {
   // Temporarily remove from observer to ignore notifications caused by us.
   model_->search_box()->RemoveObserver(this);
diff --git a/ui/app_list/views/search_box_view.h b/ui/app_list/views/search_box_view.h
index d48a58a..088a9abb 100644
--- a/ui/app_list/views/search_box_view.h
+++ b/ui/app_list/views/search_box_view.h
@@ -107,6 +107,9 @@
   void OnGestureEvent(ui::GestureEvent* event) override;
   void OnMouseEvent(ui::MouseEvent* event) override;
 
+  // Updates the |content_container_|'s background corner radius.
+  void UpdateBackground(bool search_results_state);
+
  private:
   // Updates model text and selection model with current Textfield info.
   void UpdateModel();
diff --git a/ui/app_list/views/search_result_page_view.cc b/ui/app_list/views/search_result_page_view.cc
index ff6e6a3..7388968d 100644
--- a/ui/app_list/views/search_result_page_view.cc
+++ b/ui/app_list/views/search_result_page_view.cc
@@ -16,6 +16,7 @@
 #include "ui/app_list/views/search_box_view.h"
 #include "ui/app_list/views/search_result_list_view.h"
 #include "ui/app_list/views/search_result_tile_item_list_view.h"
+#include "ui/gfx/canvas.h"
 #include "ui/gfx/geometry/insets.h"
 #include "ui/gfx/shadow_value.h"
 #include "ui/views/background.h"
@@ -34,15 +35,24 @@
 constexpr int kFullscreenHeight = 440;
 
 // The z-height of the search box and cards in this view.
-const int kSearchResultZHeight = 1;
+constexpr int kSearchResultZHeight = 1;
+
+constexpr int kBackgroundCornerRadius = 4;
+constexpr int kSeparatorPadding = 12;
+constexpr int kSeparatorThickness = 1;
+
+constexpr SkColor kBackgroundColor = SK_ColorWHITE;
+constexpr SkColor kSeparatorColor = SkColorSetARGBMacro(0x1F, 0x00, 0x00, 0x00);
 
 // A container view that ensures the card background and the shadow are painted
 // in the correct order.
 class SearchCardView : public views::View {
  public:
   explicit SearchCardView(views::View* content_view) {
-    SetBorder(base::MakeUnique<views::ShadowBorder>(
-        GetShadowForZHeight(kSearchResultZHeight)));
+    if (!features::IsFullscreenAppListEnabled()) {
+      SetBorder(base::MakeUnique<views::ShadowBorder>(
+          GetShadowForZHeight(kSearchResultZHeight)));
+    }
     SetLayoutManager(new views::FillLayout());
     content_view->SetBackground(
         views::CreateSolidBackground(kCardBackgroundColor));
@@ -66,25 +76,97 @@
   DISALLOW_COPY_AND_ASSIGN(ZeroWidthVerticalScrollBar);
 };
 
+class SearchResultPageBackground : public views::Background {
+ public:
+  SearchResultPageBackground() {}
+  ~SearchResultPageBackground() override {}
+
+ private:
+  // views::Background overrides:
+  void Paint(gfx::Canvas* canvas, views::View* view) const override {
+    gfx::Rect bounds = view->GetContentsBounds();
+    const SkScalar kCornerRadiusScalar = SkIntToScalar(kBackgroundCornerRadius);
+    const SkScalar kRadius[8] = {0,
+                                 0,
+                                 0,
+                                 0,
+                                 kCornerRadiusScalar,
+                                 kCornerRadiusScalar,
+                                 kCornerRadiusScalar,
+                                 kCornerRadiusScalar};
+    SkPath path;
+    path.addRoundRect(gfx::RectToSkRect(bounds), kRadius);
+    cc::PaintFlags flags;
+    flags.setAntiAlias(true);
+    flags.setColor(kBackgroundColor);
+    canvas->DrawPath(path, flags);
+
+    // Draws a separator between SearchBoxView and SearchResultPageView.
+    bounds.set_height(kSeparatorThickness);
+    canvas->FillRect(bounds, kSeparatorColor);
+  }
+
+  DISALLOW_COPY_AND_ASSIGN(SearchResultPageBackground);
+};
+
 }  // namespace
 
+class SearchResultPageView::HorizontalSeparator : public views::View {
+ public:
+  explicit HorizontalSeparator(int preferred_width)
+      : preferred_width_(preferred_width) {
+    SetBorder(views::CreateEmptyBorder(
+        gfx::Insets(0, kSeparatorPadding, 0, kSeparatorPadding)));
+  }
+
+  ~HorizontalSeparator() override {}
+
+  // views::View overrides:
+  const char* GetClassName() const override { return "HorizontalSeparator"; }
+
+  gfx::Size CalculatePreferredSize() const override {
+    return gfx::Size(preferred_width_, kSeparatorThickness);
+  }
+
+  void OnPaint(gfx::Canvas* canvas) override {
+    gfx::Rect rect = GetContentsBounds();
+    canvas->FillRect(rect, kSeparatorColor);
+    View::OnPaint(canvas);
+  }
+
+ private:
+  const int preferred_width_;
+
+  DISALLOW_COPY_AND_ASSIGN(HorizontalSeparator);
+};
+
 SearchResultPageView::SearchResultPageView()
     : selected_index_(0),
-      is_new_design_(features::IsSearchResultsNewDesignEnabled()),
+      is_fullscreen_app_list_enabled_(features::IsFullscreenAppListEnabled()),
       contents_view_(new views::View) {
-  gfx::ShadowValue shadow = GetShadowForZHeight(kSearchResultZHeight);
-  std::unique_ptr<views::Border> border(new views::ShadowBorder(shadow));
+  if (is_fullscreen_app_list_enabled_) {
+    contents_view_->SetLayoutManager(
+        new views::BoxLayout(views::BoxLayout::kVertical, gfx::Insets(), 0));
+    SetBackground(base::MakeUnique<SearchResultPageBackground>());
+  } else {
+    gfx::ShadowValue shadow = GetShadowForZHeight(kSearchResultZHeight);
+    std::unique_ptr<views::Border> border(new views::ShadowBorder(shadow));
 
-  gfx::Insets insets =
-      gfx::Insets(kTopPadding, kSearchBoxPadding, 0, kSearchBoxPadding);
-  insets += -border->GetInsets();
+    gfx::Insets insets =
+        gfx::Insets(kTopPadding, kSearchBoxPadding, 0, kSearchBoxPadding);
+    insets += -border->GetInsets();
 
-  views::BoxLayout* layout = new views::BoxLayout(views::BoxLayout::kVertical,
-                                                  gfx::Insets(), kGroupSpacing);
-  layout->set_inside_border_insets(insets);
-  contents_view_->SetLayoutManager(layout);
+    views::BoxLayout* layout = new views::BoxLayout(
+        views::BoxLayout::kVertical, gfx::Insets(), kGroupSpacing);
+    layout->set_inside_border_insets(insets);
+    contents_view_->SetLayoutManager(layout);
+  }
 
   views::ScrollView* const scroller = new views::ScrollView;
+  if (is_fullscreen_app_list_enabled_) {
+    scroller->SetBorder(
+        views::CreateEmptyBorder(gfx::Insets(kSeparatorThickness, 0, 0, 0)));
+  }
   scroller->SetContents(contents_view_);
   // Setting clip height is necessary to make ScrollView take into account its
   // contents' size. Using zeroes doesn't prevent it from scrolling and sizing
@@ -110,6 +192,11 @@
 void SearchResultPageView::AddSearchResultContainerView(
     AppListModel::SearchResults* results_model,
     SearchResultContainerView* result_container) {
+  if (is_fullscreen_app_list_enabled_ && !result_container_views_.empty()) {
+    HorizontalSeparator* separator = new HorizontalSeparator(bounds().width());
+    contents_view_->AddChildView(separator);
+    separators_.push_back(separator);
+  }
   contents_view_->AddChildView(new SearchCardView(result_container));
   result_container_views_.push_back(result_container);
   result_container->SetResults(results_model);
@@ -185,6 +272,8 @@
 
 void SearchResultPageView::OnSearchResultContainerResultsChanged() {
   DCHECK(!result_container_views_.empty());
+  if (is_fullscreen_app_list_enabled_)
+    DCHECK(result_container_views_.size() == separators_.size() + 1);
 
   // Only sort and layout the containers when they have all updated.
   for (SearchResultContainerView* view : result_container_views_) {
@@ -213,7 +302,22 @@
   int result_y_index = 0;
   for (size_t i = 0; i < result_container_views_.size(); ++i) {
     SearchResultContainerView* view = result_container_views_[i];
-    contents_view_->ReorderChildView(view->parent(), i);
+
+    if (is_fullscreen_app_list_enabled_ && i > 0) {
+      HorizontalSeparator* separator = separators_[i - 1];
+      // Hides the separator above the container that has no results.
+      if (!view->container_score())
+        separator->SetVisible(false);
+      else
+        separator->SetVisible(true);
+
+      contents_view_->ReorderChildView(separator, i * 2 - 1);
+      contents_view_->ReorderChildView(view->parent(), i * 2);
+
+      result_y_index += kSeparatorThickness;
+    } else {
+      contents_view_->ReorderChildView(view->parent(), i);
+    }
 
     view->NotifyFirstResultYIndex(result_y_index);
 
@@ -246,8 +350,11 @@
     AppListModel::State state) const {
   gfx::Rect onscreen_bounds = GetDefaultContentsBounds();
 
-  if (is_new_design_)
-    onscreen_bounds.set_height(kFullscreenHeight);
+  if (is_fullscreen_app_list_enabled_) {
+    gfx::Rect search_box_bounds = GetSearchBoxBounds();
+    onscreen_bounds.set_y(search_box_bounds.bottom());
+    onscreen_bounds.set_height(kFullscreenHeight - search_box_bounds.height());
+  }
 
   switch (state) {
     case AppListModel::STATE_SEARCH_RESULTS:
@@ -281,4 +388,13 @@
   ClearSelectedIndex();
 }
 
+gfx::Rect SearchResultPageView::GetSearchBoxBounds() const {
+  gfx::Rect rect(AppListPage::GetSearchBoxBounds());
+  if (is_fullscreen_app_list_enabled_) {
+    rect.set_x(bounds().x());
+    rect.set_width(bounds().width());
+  }
+  return rect;
+}
+
 }  // namespace app_list
diff --git a/ui/app_list/views/search_result_page_view.h b/ui/app_list/views/search_result_page_view.h
index 66d3e4b..238eb707 100644
--- a/ui/app_list/views/search_result_page_view.h
+++ b/ui/app_list/views/search_result_page_view.h
@@ -47,6 +47,7 @@
                           AppListModel::State to_state) override;
   int GetSearchBoxZHeight() const override;
   void OnHidden() override;
+  gfx::Rect GetSearchBoxBounds() const override;
 
   void ClearSelectedIndex();
 
@@ -56,6 +57,9 @@
   views::View* contents_view() { return contents_view_; }
 
  private:
+  // Separator between SearchResultContainerView.
+  class HorizontalSeparator;
+
   // |directional_movement| is true if the navigation was caused by directional
   // controls (eg, arrow keys), as opposed to linear controls (eg, Tab).
   void SetSelectedIndex(int index, bool directional_movement);
@@ -65,11 +69,12 @@
   // the views hierarchy.
   std::vector<SearchResultContainerView*> result_container_views_;
 
+  std::vector<HorizontalSeparator*> separators_;
+
   // -1 indicates no selection.
   int selected_index_;
 
-  // Whether to use new UX design for search results.
-  bool const is_new_design_;
+  const bool is_fullscreen_app_list_enabled_;
 
   // View containing SearchCardView instances. Owned by view hierarchy.
   views::View* const contents_view_;
diff --git a/ui/app_list/views/search_result_view.cc b/ui/app_list/views/search_result_view.cc
index 320585d..67c16872 100644
--- a/ui/app_list/views/search_result_view.cc
+++ b/ui/app_list/views/search_result_view.cc
@@ -8,6 +8,7 @@
 
 #include "base/strings/utf_string_conversions.h"
 #include "ui/app_list/app_list_constants.h"
+#include "ui/app_list/app_list_features.h"
 #include "ui/app_list/app_list_switches.h"
 #include "ui/app_list/search_result.h"
 #include "ui/app_list/views/search_result_actions_view.h"
@@ -34,6 +35,8 @@
 const int kBorderSize = 1;
 const SkColor kSeparatorColor = SkColorSetRGB(0xE1, 0xE1, 0xE1);
 
+constexpr int kPreferredHeightFullScreen = 48;
+
 // Extra margin at the right of the rightmost action icon.
 const int kActionButtonRightMargin = 8;
 
@@ -80,7 +83,8 @@
       icon_(new views::ImageView),
       badge_icon_(new views::ImageView),
       actions_view_(new SearchResultActionsView(this)),
-      progress_bar_(new views::ProgressBar) {
+      progress_bar_(new views::ProgressBar),
+      is_fullscreen_app_list_enabled_(features::IsFullscreenAppListEnabled()) {
   icon_->set_can_process_events_within_subtree(false);
   badge_icon_->set_can_process_events_within_subtree(false);
 
@@ -165,7 +169,9 @@
 }
 
 gfx::Size SearchResultView::CalculatePreferredSize() const {
-  return gfx::Size(kPreferredWidth, kPreferredHeight);
+  return gfx::Size(kPreferredWidth, is_fullscreen_app_list_enabled_
+                                        ? kPreferredHeightFullScreen
+                                        : kPreferredHeight);
 }
 
 void SearchResultView::Layout() {
@@ -258,7 +264,7 @@
   else if (hover)
     canvas->FillRect(content_rect, kHighlightedColor);
 
-  if (!is_last_result_) {
+  if (!is_fullscreen_app_list_enabled_ && !is_last_result_) {
     gfx::Rect line_rect = content_rect;
     line_rect.set_height(kBorderSize);
     line_rect.set_y(content_rect.bottom() - kBorderSize);
diff --git a/ui/app_list/views/search_result_view.h b/ui/app_list/views/search_result_view.h
index dee91d4..6f4841d 100644
--- a/ui/app_list/views/search_result_view.h
+++ b/ui/app_list/views/search_result_view.h
@@ -121,6 +121,8 @@
 
   std::unique_ptr<views::MenuRunner> context_menu_runner_;
 
+  const bool is_fullscreen_app_list_enabled_;
+
   DISALLOW_COPY_AND_ASSIGN(SearchResultView);
 };
 
diff --git a/ui/aura/demo/demo_main.cc b/ui/aura/demo/demo_main.cc
index c8a5afc..edf18901 100644
--- a/ui/aura/demo/demo_main.cc
+++ b/ui/aura/demo/demo_main.cc
@@ -139,7 +139,7 @@
 
   // The ContextFactory must exist before any Compositors are created.
   viz::HostFrameSinkManager host_frame_sink_manager;
-  cc::FrameSinkManager frame_sink_manager;
+  viz::FrameSinkManager frame_sink_manager;
   auto context_factory = base::MakeUnique<ui::InProcessContextFactory>(
       &host_frame_sink_manager, &frame_sink_manager);
   context_factory->set_use_test_surface(false);
diff --git a/ui/aura/local/layer_tree_frame_sink_local.cc b/ui/aura/local/layer_tree_frame_sink_local.cc
index c608b358..a9adb3d 100644
--- a/ui/aura/local/layer_tree_frame_sink_local.cc
+++ b/ui/aura/local/layer_tree_frame_sink_local.cc
@@ -17,7 +17,7 @@
 
 LayerTreeFrameSinkLocal::LayerTreeFrameSinkLocal(
     const viz::FrameSinkId& frame_sink_id,
-    cc::FrameSinkManager* frame_sink_manager)
+    viz::FrameSinkManager* frame_sink_manager)
     : cc::LayerTreeFrameSink(nullptr, nullptr, nullptr, nullptr),
       frame_sink_id_(frame_sink_id),
       frame_sink_manager_(frame_sink_manager) {}
diff --git a/ui/aura/local/layer_tree_frame_sink_local.h b/ui/aura/local/layer_tree_frame_sink_local.h
index ed9c60c6..7a37fbe 100644
--- a/ui/aura/local/layer_tree_frame_sink_local.h
+++ b/ui/aura/local/layer_tree_frame_sink_local.h
@@ -15,11 +15,8 @@
 #include "ui/aura/window_port.h"
 #include "ui/base/property_data.h"
 
-namespace cc {
-class FrameSinkManager;
-}  // namespace cc
-
 namespace viz {
+class FrameSinkManager;
 class CompositorFrameSinkSupport;
 }
 
@@ -34,7 +31,7 @@
                                 public cc::ExternalBeginFrameSourceClient {
  public:
   LayerTreeFrameSinkLocal(const viz::FrameSinkId& frame_sink_id,
-                          cc::FrameSinkManager* frame_sink_manager);
+                          viz::FrameSinkManager* frame_sink_manager);
   ~LayerTreeFrameSinkLocal() override;
 
   using SurfaceChangedCallback =
@@ -62,7 +59,7 @@
 
  private:
   const viz::FrameSinkId frame_sink_id_;
-  cc::FrameSinkManager* const frame_sink_manager_;
+  viz::FrameSinkManager* const frame_sink_manager_;
   std::unique_ptr<viz::CompositorFrameSinkSupport> support_;
   gfx::Size surface_size_;
   float device_scale_factor_ = 0;
diff --git a/ui/aura/local/window_port_local.cc b/ui/aura/local/window_port_local.cc
index 8fbaff3..8b987fc 100644
--- a/ui/aura/local/window_port_local.cc
+++ b/ui/aura/local/window_port_local.cc
@@ -4,7 +4,7 @@
 
 #include "ui/aura/local/window_port_local.h"
 
-#include "cc/surfaces/frame_sink_manager.h"
+#include "components/viz/service/frame_sinks/frame_sink_manager.h"
 #include "ui/aura/client/cursor_client.h"
 #include "ui/aura/env.h"
 #include "ui/aura/local/layer_tree_frame_sink_local.h"
diff --git a/ui/compositor/BUILD.gn b/ui/compositor/BUILD.gn
index 1da128f8..4612fd1 100644
--- a/ui/compositor/BUILD.gn
+++ b/ui/compositor/BUILD.gn
@@ -91,6 +91,7 @@
     "//cc/surfaces:surfaces",
     "//components/viz/common",
     "//components/viz/host",
+    "//components/viz/service",
     "//gpu/command_buffer/common",
     "//skia",
     "//ui/display",
diff --git a/ui/compositor/DEPS b/ui/compositor/DEPS
index 5fa569a7..75b24ec 100644
--- a/ui/compositor/DEPS
+++ b/ui/compositor/DEPS
@@ -3,6 +3,7 @@
   "-cc/blink",
   "+components/viz/common",
   "+components/viz/host",
+  "+components/viz/service",
   "+gpu/command_buffer/client/gles2_interface.h",
   "+services/ui/public/cpp",
   "+skia/ext/refptr.h",
diff --git a/ui/compositor/compositor.cc b/ui/compositor/compositor.cc
index de61452..b80e735 100644
--- a/ui/compositor/compositor.cc
+++ b/ui/compositor/compositor.cc
@@ -31,12 +31,12 @@
 #include "cc/output/context_provider.h"
 #include "cc/output/latency_info_swap_promise.h"
 #include "cc/scheduler/begin_frame_source.h"
-#include "cc/surfaces/frame_sink_manager.h"
 #include "cc/trees/layer_tree_host.h"
 #include "cc/trees/layer_tree_settings.h"
 #include "components/viz/common/quads/resource_format.h"
 #include "components/viz/common/resources/resource_settings.h"
 #include "components/viz/common/surfaces/local_surface_id_allocator.h"
+#include "components/viz/service/frame_sinks/frame_sink_manager.h"
 #include "third_party/skia/include/core/SkBitmap.h"
 #include "ui/compositor/compositor_observer.h"
 #include "ui/compositor/compositor_switches.h"
diff --git a/ui/compositor/compositor.h b/ui/compositor/compositor.h
index 90bd1b0..7917df9 100644
--- a/ui/compositor/compositor.h
+++ b/ui/compositor/compositor.h
@@ -41,7 +41,6 @@
 class AnimationHost;
 class AnimationTimeline;
 class ContextProvider;
-class FrameSinkManager;
 class Layer;
 class LayerTreeDebugState;
 class LayerTreeFrameSink;
@@ -60,6 +59,7 @@
 }
 
 namespace viz {
+class FrameSinkManager;
 class HostFrameSinkManager;
 class LocalSurfaceId;
 class ResourceSettings;
@@ -108,7 +108,7 @@
   // Gets the frame sink manager.
   // TODO(staraz): Remove GetFrameSinkManager once FrameSinkManager is merged
   // into FrameSinkManagerImpl.
-  virtual cc::FrameSinkManager* GetFrameSinkManager() = 0;
+  virtual viz::FrameSinkManager* GetFrameSinkManager() = 0;
 
   // Gets the frame sink manager host instance.
   virtual viz::HostFrameSinkManager* GetHostFrameSinkManager() = 0;
diff --git a/ui/compositor/test/context_factories_for_test.cc b/ui/compositor/test/context_factories_for_test.cc
index 5c6ff1fd..75d15bd9 100644
--- a/ui/compositor/test/context_factories_for_test.cc
+++ b/ui/compositor/test/context_factories_for_test.cc
@@ -7,8 +7,8 @@
 #include "base/command_line.h"
 #include "base/sys_info.h"
 #include "base/threading/sequenced_task_runner_handle.h"
-#include "cc/surfaces/frame_sink_manager.h"
 #include "components/viz/host/host_frame_sink_manager.h"
+#include "components/viz/service/frame_sinks/frame_sink_manager.h"
 #include "components/viz/service/frame_sinks/frame_sink_manager_impl.h"
 #include "ui/compositor/compositor.h"
 #include "ui/compositor/compositor_switches.h"
diff --git a/ui/compositor/test/in_process_context_factory.cc b/ui/compositor/test/in_process_context_factory.cc
index 350f16a..b34ef4f 100644
--- a/ui/compositor/test/in_process_context_factory.cc
+++ b/ui/compositor/test/in_process_context_factory.cc
@@ -18,13 +18,13 @@
 #include "cc/output/texture_mailbox_deleter.h"
 #include "cc/scheduler/begin_frame_source.h"
 #include "cc/scheduler/delay_based_time_source.h"
-#include "cc/surfaces/frame_sink_manager.h"
 #include "cc/test/pixel_test_output_surface.h"
 #include "components/viz/common/surfaces/local_surface_id_allocator.h"
 #include "components/viz/host/host_frame_sink_manager.h"
 #include "components/viz/service/display/display.h"
 #include "components/viz/service/display/display_scheduler.h"
 #include "components/viz/service/frame_sinks/direct_layer_tree_frame_sink.h"
+#include "components/viz/service/frame_sinks/frame_sink_manager.h"
 #include "gpu/command_buffer/client/context_support.h"
 #include "gpu/command_buffer/client/gles2_interface.h"
 #include "gpu/command_buffer/common/gles2_cmd_utils.h"
@@ -137,7 +137,7 @@
 
 InProcessContextFactory::InProcessContextFactory(
     viz::HostFrameSinkManager* host_frame_sink_manager,
-    cc::FrameSinkManager* frame_sink_manager)
+    viz::FrameSinkManager* frame_sink_manager)
     : frame_sink_id_allocator_(kDefaultClientId),
       use_test_surface_(true),
       host_frame_sink_manager_(host_frame_sink_manager),
@@ -349,7 +349,7 @@
   observer_list_.RemoveObserver(observer);
 }
 
-cc::FrameSinkManager* InProcessContextFactory::GetFrameSinkManager() {
+viz::FrameSinkManager* InProcessContextFactory::GetFrameSinkManager() {
   return frame_sink_manager_;
 }
 
diff --git a/ui/compositor/test/in_process_context_factory.h b/ui/compositor/test/in_process_context_factory.h
index 0482b788..53be48be 100644
--- a/ui/compositor/test/in_process_context_factory.h
+++ b/ui/compositor/test/in_process_context_factory.h
@@ -9,13 +9,13 @@
 #include <memory>
 
 #include "base/macros.h"
-#include "cc/surfaces/frame_sink_manager.h"
 #include "cc/test/test_gpu_memory_buffer_manager.h"
 #include "cc/test/test_image_factory.h"
 #include "cc/test/test_shared_bitmap_manager.h"
 #include "cc/test/test_task_graph_runner.h"
 #include "components/viz/common/surfaces/frame_sink_id_allocator.h"
 #include "components/viz/service/display/display.h"
+#include "components/viz/service/frame_sinks/frame_sink_manager.h"
 #include "gpu/ipc/common/surface_handle.h"
 #include "ui/compositor/compositor.h"
 
@@ -39,7 +39,7 @@
   // TODO(crbug.com/657959): |frame_sink_manager| should go away and we should
   // use the LayerTreeFrameSink from the HostFrameSinkManager.
   InProcessContextFactory(viz::HostFrameSinkManager* host_frame_sink_manager,
-                          cc::FrameSinkManager* frame_sink_manager);
+                          viz::FrameSinkManager* frame_sink_manager);
   ~InProcessContextFactory() override;
 
   // If true (the default) an OutputSurface is created that does not display
@@ -86,7 +86,7 @@
   const viz::ResourceSettings& GetResourceSettings() const override;
   void AddObserver(ContextFactoryObserver* observer) override;
   void RemoveObserver(ContextFactoryObserver* observer) override;
-  cc::FrameSinkManager* GetFrameSinkManager() override;
+  viz::FrameSinkManager* GetFrameSinkManager() override;
 
  private:
   struct PerCompositorData;
@@ -103,7 +103,7 @@
   bool use_test_surface_;
   double refresh_rate_ = 60.0;
   viz::HostFrameSinkManager* const host_frame_sink_manager_;
-  cc::FrameSinkManager* const frame_sink_manager_;
+  viz::FrameSinkManager* const frame_sink_manager_;
   base::ObserverList<ContextFactoryObserver> observer_list_;
 
   cc::RendererSettings renderer_settings_;
diff --git a/ui/events/devices/input_device_manager.cc b/ui/events/devices/input_device_manager.cc
index b6ca664..1f53855 100644
--- a/ui/events/devices/input_device_manager.cc
+++ b/ui/events/devices/input_device_manager.cc
@@ -3,31 +3,41 @@
 // found in the LICENSE file.
 
 #include "ui/events/devices/input_device_manager.h"
+#include "base/lazy_instance.h"
+#include "base/threading/thread_local.h"
 
 namespace ui {
+namespace {
 
-InputDeviceManager* InputDeviceManager::instance_ = nullptr;
+// InputDeviceManager singleton is thread-local so that different instances can
+// be used on different threads (eg. UI Service thread vs. browser UI thread).
+base::LazyInstance<base::ThreadLocalPointer<InputDeviceManager>>::Leaky
+    lazy_tls_ptr = LAZY_INSTANCE_INITIALIZER;
+
+}  // namespace
 
 // static
 InputDeviceManager* InputDeviceManager::GetInstance() {
-  DCHECK(instance_);
-  return instance_;
+  InputDeviceManager* instance = lazy_tls_ptr.Pointer()->Get();
+  DCHECK(instance) << "InputDeviceManager::SetInstance must be called before "
+                      "getting the instance of InputDeviceManager.";
+  return instance;
 }
 
 // static
 bool InputDeviceManager::HasInstance() {
-  return instance_ != nullptr;
+  return lazy_tls_ptr.Pointer()->Get() != nullptr;
 }
 
 // static
 void InputDeviceManager::SetInstance(InputDeviceManager* instance) {
-  DCHECK(!instance_);
-  instance_ = instance;
+  DCHECK(!lazy_tls_ptr.Pointer()->Get());
+  lazy_tls_ptr.Pointer()->Set(instance);
 }
 
 // static
 void InputDeviceManager::ClearInstance() {
-  instance_ = nullptr;
+  lazy_tls_ptr.Pointer()->Set(nullptr);
 }
 
 }  // namespace ui
diff --git a/ui/events/devices/input_device_manager.h b/ui/events/devices/input_device_manager.h
index 83835ad..59526ea3 100644
--- a/ui/events/devices/input_device_manager.h
+++ b/ui/events/devices/input_device_manager.h
@@ -15,8 +15,8 @@
 
 namespace ui {
 
-// Interface to query available input devices. Holds a static pointer to an
-// implementation that provides this service. The implementation could be
+// Interface to query available input devices. Holds a thread-local pointer to
+// an implementation that provides this service. The implementation could be
 // DeviceDataManager or something that mirrors the necessary state if
 // DeviceDataManager is in a different process.
 class EVENTS_DEVICES_EXPORT InputDeviceManager {
@@ -39,7 +39,7 @@
   virtual void RemoveObserver(InputDeviceEventObserver* observer) = 0;
 
  protected:
-  // Sets the instance. This should only be set once per process.
+  // Sets the instance. This should only be set once per thread.
   static void SetInstance(InputDeviceManager* instance);
 
   // Clears the instance. InputDeviceManager doesn't own the instance and won't
diff --git a/ui/events/platform/platform_event_source.cc b/ui/events/platform/platform_event_source.cc
index 9be6630e..c521b28 100644
--- a/ui/events/platform/platform_event_source.cc
+++ b/ui/events/platform/platform_event_source.cc
@@ -6,30 +6,42 @@
 
 #include <algorithm>
 
+#include "base/lazy_instance.h"
 #include "base/memory/ptr_util.h"
 #include "base/message_loop/message_loop.h"
+#include "base/threading/thread_local.h"
 #include "ui/events/platform/platform_event_dispatcher.h"
 #include "ui/events/platform/platform_event_observer.h"
 #include "ui/events/platform/scoped_event_dispatcher.h"
 
 namespace ui {
 
-// static
-PlatformEventSource* PlatformEventSource::instance_ = NULL;
+namespace {
+
+// PlatformEventSource singleton is thread local so that different instances
+// can be used on different threads (e.g. browser thread should be able to
+// access PlatformEventSource owned by the UI Service's thread).
+base::LazyInstance<base::ThreadLocalPointer<PlatformEventSource>>::Leaky
+    lazy_tls_ptr = LAZY_INSTANCE_INITIALIZER;
+
+}  // namespace
 
 PlatformEventSource::PlatformEventSource()
     : overridden_dispatcher_(NULL),
       overridden_dispatcher_restored_(false) {
-  CHECK(!instance_) << "Only one platform event source can be created.";
-  instance_ = this;
+  CHECK(!lazy_tls_ptr.Pointer()->Get())
+      << "Only one platform event source can be created.";
+  lazy_tls_ptr.Pointer()->Set(this);
 }
 
 PlatformEventSource::~PlatformEventSource() {
-  CHECK_EQ(this, instance_);
-  instance_ = NULL;
+  CHECK_EQ(this, lazy_tls_ptr.Pointer()->Get());
+  lazy_tls_ptr.Pointer()->Set(nullptr);
 }
 
-PlatformEventSource* PlatformEventSource::GetInstance() { return instance_; }
+PlatformEventSource* PlatformEventSource::GetInstance() {
+  return lazy_tls_ptr.Pointer()->Get();
+}
 
 void PlatformEventSource::AddPlatformEventDispatcher(
     PlatformEventDispatcher* dispatcher) {
diff --git a/ui/events/platform/platform_event_source.h b/ui/events/platform/platform_event_source.h
index 3f16bd6..b4e3084 100644
--- a/ui/events/platform/platform_event_source.h
+++ b/ui/events/platform/platform_event_source.h
@@ -33,6 +33,7 @@
  public:
   virtual ~PlatformEventSource();
 
+  // Returns the thread-local singleton.
   static PlatformEventSource* GetInstance();
 
   // Adds a dispatcher to the dispatcher list. If a dispatcher is added during
@@ -64,6 +65,7 @@
   void AddPlatformEventObserver(PlatformEventObserver* observer);
   void RemovePlatformEventObserver(PlatformEventObserver* observer);
 
+  // Creates PlatformEventSource and sets it as a thread-local singleton.
   static std::unique_ptr<PlatformEventSource> CreateDefault();
 
  protected:
@@ -80,8 +82,6 @@
   friend class ScopedEventDispatcher;
   friend class test::PlatformEventSourceTestAPI;
 
-  static PlatformEventSource* instance_;
-
   // This is invoked when the list of dispatchers changes (i.e. a new dispatcher
   // is added, or a dispatcher is removed).
   virtual void OnDispatcherListChanged();
diff --git a/ui/events/platform/x11/x11_event_source_libevent.cc b/ui/events/platform/x11/x11_event_source_libevent.cc
index 85bdb73..3ef8002 100644
--- a/ui/events/platform/x11/x11_event_source_libevent.cc
+++ b/ui/events/platform/x11/x11_event_source_libevent.cc
@@ -21,6 +21,23 @@
 
 namespace {
 
+std::unique_ptr<TouchEvent> CreateTouchEvent(EventType event_type,
+                                             const XEvent& xev) {
+  std::unique_ptr<TouchEvent> event = base::MakeUnique<TouchEvent>(
+      event_type, EventLocationFromXEvent(xev), EventTimeFromXEvent(xev),
+      ui::PointerDetails(
+          ui::EventPointerType::POINTER_TYPE_TOUCH, GetTouchIdFromXEvent(xev),
+          GetTouchRadiusXFromXEvent(xev), GetTouchRadiusYFromXEvent(xev),
+          GetTouchForceFromXEvent(xev)));
+
+  // Touch events don't usually have |root_location| set differently than
+  // |location|, since there is a touch device to display association, but this
+  // doesn't happen in Ozone X11.
+  event->set_root_location(EventSystemLocationFromXEvent(xev));
+
+  return event;
+}
+
 // Translates XI2 XEvent into a ui::Event.
 std::unique_ptr<ui::Event> TranslateXI2EventToEvent(const XEvent& xev) {
   EventType event_type = EventTypeFromXEvent(xev);
@@ -67,12 +84,7 @@
     case ET_TOUCH_PRESSED:
     case ET_TOUCH_CANCELLED:
     case ET_TOUCH_RELEASED:
-      return base::MakeUnique<TouchEvent>(
-          event_type, EventLocationFromXEvent(xev), EventTimeFromXEvent(xev),
-          ui::PointerDetails(
-              ui::EventPointerType::POINTER_TYPE_TOUCH,
-              GetTouchIdFromXEvent(xev), GetTouchRadiusXFromXEvent(xev),
-              GetTouchRadiusYFromXEvent(xev), GetTouchForceFromXEvent(xev)));
+      return CreateTouchEvent(event_type, xev);
     case ET_UNKNOWN:
       return nullptr;
     default:
diff --git a/ui/gfx/paint_vector_icon.cc b/ui/gfx/paint_vector_icon.cc
index f611fe8..0c642bf4 100644
--- a/ui/gfx/paint_vector_icon.cc
+++ b/ui/gfx/paint_vector_icon.cc
@@ -528,6 +528,11 @@
       badge_icon(badge_icon) {
   if (dip_size == 0)
     this->dip_size = GetDefaultSizeOfVectorIcon(icon);
+
+  // If an icon has a .1x.icon version, it should only be rendered at the size
+  // specified in that definition.
+  if (icon.path_1x)
+    DCHECK_EQ(this->dip_size, GetDefaultSizeOfVectorIcon(icon));
 }
 
 IconDescription::~IconDescription() {}
diff --git a/ui/gfx/platform_font_linux.cc b/ui/gfx/platform_font_linux.cc
index e6a81a06..0f45d85 100644
--- a/ui/gfx/platform_font_linux.cc
+++ b/ui/gfx/platform_font_linux.cc
@@ -171,8 +171,11 @@
       (weight == weight_ && style == style_)
           ? typeface_
           : CreateSkTypeface(style, weight, &new_family, &success);
-  CHECK(success) << "Could not find any font: " << new_family << ", "
-                 << kFallbackFontFamilyName;
+  if (!success) {
+    LOG(ERROR) << "Could not find any font: " << new_family << ", "
+               << kFallbackFontFamilyName << ". Falling back to the default";
+    return Font(new PlatformFontLinux);
+  }
 
   FontRenderParamsQuery query;
   query.families.push_back(new_family);
@@ -269,8 +272,14 @@
   typeface_ = typeface ? std::move(typeface)
                        : CreateSkTypeface(style & Font::ITALIC, weight,
                                           &font_family_, &success);
-  CHECK(success) << "Could not find any font: " << font_family_ << ", "
-                 << kFallbackFontFamilyName;
+
+  if (!success) {
+    LOG(ERROR) << "Could not find any font: " << font_family << ", "
+               << kFallbackFontFamilyName << ". Falling back to the default";
+
+    InitFromPlatformFont(g_default_font.Get().get());
+    return;
+  }
 
   font_size_pixels_ = font_size_pixels;
   style_ = style;
diff --git a/ui/ozone/platform/x11/ozone_platform_x11.cc b/ui/ozone/platform/x11/ozone_platform_x11.cc
index d643c21..072c5b02 100644
--- a/ui/ozone/platform/x11/ozone_platform_x11.cc
+++ b/ui/ozone/platform/x11/ozone_platform_x11.cc
@@ -15,6 +15,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "ui/base/x/x11_util.h"
 #include "ui/display/fake_display_delegate.h"
+#include "ui/events/devices/x11/touch_factory_x11.h"
 #include "ui/events/platform/x11/x11_event_source_libevent.h"
 #include "ui/ozone/common/stub_overlay_manager.h"
 #include "ui/ozone/platform/x11/x11_cursor_factory_ozone.h"
@@ -96,6 +97,8 @@
     input_controller_ = CreateStubInputController();
     cursor_factory_ozone_ = base::MakeUnique<X11CursorFactoryOzone>();
     gpu_platform_support_host_.reset(CreateStubGpuPlatformSupportHost());
+
+    TouchFactory::SetTouchDeviceListFromCommandLine();
   }
 
   void InitializeGPU(const InitParams& params) override {
diff --git a/ui/platform_window/x11/x11_window_base.cc b/ui/platform_window/x11/x11_window_base.cc
index 4e8de81..0344ded 100644
--- a/ui/platform_window/x11/x11_window_base.cc
+++ b/ui/platform_window/x11/x11_window_base.cc
@@ -14,7 +14,6 @@
 #include "base/strings/utf_string_conversions.h"
 #include "ui/base/platform_window_defaults.h"
 #include "ui/base/x/x11_window_event_manager.h"
-#include "ui/events/devices/x11/touch_factory_x11.h"
 #include "ui/events/event.h"
 #include "ui/events/event_utils.h"
 #include "ui/events/platform/platform_event_dispatcher.h"
@@ -45,7 +44,6 @@
       xroot_window_(DefaultRootWindow(xdisplay_)),
       bounds_(bounds) {
   DCHECK(delegate_);
-  TouchFactory::SetTouchDeviceListFromCommandLine();
 }
 
 X11WindowBase::~X11WindowBase() {
diff --git a/ui/platform_window/x11/x11_window_ozone.cc b/ui/platform_window/x11/x11_window_ozone.cc
index c7a016e4..e25fecaf 100644
--- a/ui/platform_window/x11/x11_window_ozone.cc
+++ b/ui/platform_window/x11/x11_window_ozone.cc
@@ -70,13 +70,9 @@
   if (grabber != None)
     return grabber == xwindow();
 
-  // TODO(kylechar): We may need to do something special for TouchEvents similar
-  // to how DrmWindowHost handles them.
-  if (static_cast<Event*>(platform_event)->IsLocatedEvent()) {
-    const LocatedEvent* event =
-        static_cast<const LocatedEvent*>(platform_event);
-    return GetBounds().Contains(event->root_location());
-  }
+  const Event* event = static_cast<const Event*>(platform_event);
+  if (event->IsLocatedEvent())
+    return GetBounds().Contains(event->AsLocatedEvent()->root_location());
 
   return true;
 }
diff --git a/ui/views/examples/examples_main.cc b/ui/views/examples/examples_main.cc
index fd3c10d9..feaba9b6 100644
--- a/ui/views/examples/examples_main.cc
+++ b/ui/views/examples/examples_main.cc
@@ -68,7 +68,7 @@
 
   // The ContextFactory must exist before any Compositors are created.
   viz::HostFrameSinkManager host_frame_sink_manager_;
-  cc::FrameSinkManager frame_sink_manager_;
+  viz::FrameSinkManager frame_sink_manager_;
   auto context_factory = base::MakeUnique<ui::InProcessContextFactory>(
       &host_frame_sink_manager_, &frame_sink_manager_);
   context_factory->set_use_test_surface(false);
diff --git a/ui/wm/core/easy_resize_window_targeter.cc b/ui/wm/core/easy_resize_window_targeter.cc
index a5abaec..f523031 100644
--- a/ui/wm/core/easy_resize_window_targeter.cc
+++ b/ui/wm/core/easy_resize_window_targeter.cc
@@ -5,6 +5,7 @@
 #include "ui/wm/core/easy_resize_window_targeter.h"
 
 #include "services/ui/public/interfaces/window_manager.mojom.h"
+#include "ui/aura/client/aura_constants.h"
 #include "ui/aura/client/transient_window_client.h"
 #include "ui/aura/env.h"
 #include "ui/aura/mus/window_port_mus.h"
@@ -21,11 +22,11 @@
     const gfx::Insets& mouse_extend,
     const gfx::Insets& touch_extend)
     : container_(container) {
+  DCHECK(container_);
   SetInsets(mouse_extend, touch_extend);
 }
 
-EasyResizeWindowTargeter::~EasyResizeWindowTargeter() {
-}
+EasyResizeWindowTargeter::~EasyResizeWindowTargeter() {}
 
 void EasyResizeWindowTargeter::SetInsets(const gfx::Insets& mouse_extend,
                                          const gfx::Insets& touch_extend) {
@@ -69,11 +70,17 @@
   if (window->parent() != container_)
     return false;
 
+  const bool can_resize =
+      window->GetProperty(aura::client::kResizeBehaviorKey) &
+      ui::mojom::kResizeBehaviorCanResize;
   aura::client::TransientWindowClient* transient_window_client =
       aura::client::GetTransientWindowClient();
-  return !transient_window_client ||
-      !transient_window_client->GetTransientParent(window) ||
-      transient_window_client->GetTransientParent(window) == container_;
+  const aura::Window* transient_parent =
+      transient_window_client
+          ? transient_window_client->GetTransientParent(window)
+          : nullptr;
+  return !transient_parent || transient_parent == container_ ||
+         (can_resize && transient_parent->parent() == container_);
 }
 
 }  // namespace wm