Update from chromium https://crrev.com/301725/

This updates DEPS to reflect changes in 301725 /
90a7c4e3fdeb82a18e17f24e56345b9086a8308b, imports changes, and adds
a patch file for our ui/gl/gl_surface modifications.

Review URL: https://codereview.chromium.org/669813003
diff --git a/DEPS b/DEPS
index dbde5b0..b92a671 100644
--- a/DEPS
+++ b/DEPS
@@ -30,12 +30,12 @@
   'skia_git': 'https://skia.googlesource.com',
   'boringssl_git': 'https://boringssl.googlesource.com',
   'sfntly_revision': '1bdaae8fc788a5ac8936d68bf24f37d977a13dac',
-  'skia_revision': '30b83d45a3af444e6868c638d86442c2ea3e20c6',
+  'skia_revision': '32501a1bd4964576264795ada7e9c3bf572285b3',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and V8 without interference from each other.
   'v8_branch': 'trunk',
-  'v8_revision': 'fb0f6c03710de36d4f11b8164a76c8a66008f5d9', # from svn revision 24879
+  'v8_revision': 'bfb312d4b40507780e15bfee2e0dc32f1391c4db', # from svn revision 24925
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
@@ -136,7 +136,7 @@
 
     # For Linux and Chromium OS.
     'src/third_party/cros_system_api':
-     Var('chromium_git') + '/chromiumos/platform/system_api.git' + '@' + '75502d403cfbc60ab1e1c81e8cbe7d45afb6bd0e',
+     Var('chromium_git') + '/chromiumos/platform/system_api.git' + '@' + '7d5f30c6bd012260e5266c6e9624f4fed91eb852',
 
     # Note that this is different from Android's freetype repo.
     'src/third_party/freetype2/src':
diff --git a/base/BUILD.gn b/base/BUILD.gn
index d94b440..84beb15 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -57,6 +57,7 @@
     "android/jni_weak_ref.h",
     "android/library_loader/library_loader_hooks.cc",
     "android/library_loader/library_loader_hooks.h",
+    "android/library_loader/library_load_from_apk_status_codes.h",
     "android/memory_pressure_listener_android.cc",
     "android/memory_pressure_listener_android.h",
     "android/java_handler_thread.cc",
@@ -507,10 +508,12 @@
     "process/process_metrics_win.cc",
     "process/process_posix.cc",
     "process/process_win.cc",
-    "profiler/scoped_profile.cc",
-    "profiler/scoped_profile.h",
     "profiler/alternate_timer.cc",
     "profiler/alternate_timer.h",
+    "profiler/scoped_profile.cc",
+    "profiler/scoped_profile.h",
+    "profiler/scoped_tracker.cc",
+    "profiler/scoped_tracker.h",
     "profiler/tracked_time.cc",
     "profiler/tracked_time.h",
     "rand_util.cc",
@@ -1340,7 +1343,6 @@
     "//base/test:run_all_unittests",
     "//base/test:test_support",
     "//base/third_party/dynamic_annotations",
-    "//base/third_party/nspr",
     "//testing/gmock",
     "//testing/gtest",
     "//third_party/icu",
@@ -1464,14 +1466,17 @@
   }
 
   # GYP: //base.gyp:base_java_application_state
+  # GYP: //base.gyp:base_java_library_load_from_apk_status_codes
   # GYP: //base.gyp:base_java_memory_pressure_level
   java_cpp_enum("base_android_java_enums_srcjar") {
     sources = [
       "android/application_status_listener.h",
+      "android/library_loader/library_load_from_apk_status_codes.h",
       "memory/memory_pressure_listener.h",
     ]
     outputs = [
       "org/chromium/base/ApplicationState.java",
+      "org/chromium/base/library_loader/LibraryLoadFromApkStatusCodes.java",
       "org/chromium/base/MemoryPressureLevel.java",
     ]
   }
diff --git a/base/OWNERS b/base/OWNERS
index a014c74..92844b6 100644
--- a/base/OWNERS
+++ b/base/OWNERS
@@ -9,6 +9,19 @@
 # On extended leave.
 willchan@chromium.org
 
+# Chromium is a very mature project, most things that are generally useful are
+# already here, and that things not here aren't generally useful.
+#
+# Base is pulled into many projects. For example, various ChromeOS daemons. So
+# the bar for adding stuff is that it must have demonstrated wide
+# applicability. Prefer to add things closer to where they're used (i.e. "not
+# base"), and pull into base only when needed.  In a project our size,
+# sometimes even duplication is OK and inevitable.
+#
+# Adding a new logging macro DPVELOG_NE is not more clear than just
+# writing the stuff you want to log in a regular logging statement, even
+# if it makes your calling code longer. Just add it to your own code.
+
 per-file *.isolate=csharp@chromium.org
 per-file *.isolate=maruel@chromium.org
 per-file bind.h=ajwong@chromium.org
diff --git a/base/android/java/src/org/chromium/base/ResourceExtractor.java b/base/android/java/src/org/chromium/base/ResourceExtractor.java
index 4cf155c..37fea6c 100644
--- a/base/android/java/src/org/chromium/base/ResourceExtractor.java
+++ b/base/android/java/src/org/chromium/base/ResourceExtractor.java
@@ -36,6 +36,8 @@
     private static final String LAST_LANGUAGE = "Last language";
     private static final String PAK_FILENAMES = "Pak filenames";
     private static final String ICU_DATA_FILENAME = "icudtl.dat";
+    private static final String V8_NATIVES_DATA_FILENAME = "natives_blob.bin";
+    private static final String V8_SNAPSHOT_DATA_FILENAME = "snapshot_blob.bin";
 
     private static String[] sMandatoryPaks = null;
 
@@ -111,8 +113,11 @@
                     if (!paksToInstall.matcher(file).matches()) {
                         continue;
                     }
-                    boolean isICUData = file.equals(ICU_DATA_FILENAME);
-                    File output = new File(isICUData ? getAppDataDir() : outputDir, file);
+                    boolean isAppDataFile = file.equals(ICU_DATA_FILENAME)
+                                      || file.equals(V8_NATIVES_DATA_FILENAME)
+                                      || file.equals(V8_SNAPSHOT_DATA_FILENAME);
+                    File output = new File(isAppDataFile
+                                           ? getAppDataDir() : outputDir, file);
                     if (output.exists()) {
                         continue;
                     }
@@ -138,10 +143,11 @@
                             throw new IOException(file + " extracted with 0 length!");
                         }
 
-                        if (!isICUData) {
+                        if (!isAppDataFile) {
                             filenames.add(file);
                         } else {
-                            // icudata needs to be accessed by a renderer process.
+                            // icu and V8 data need to be accessed by a renderer
+                            // process.
                             output.setReadable(true, false);
                         }
                     } finally {
@@ -274,18 +280,21 @@
      * running the tests.
      */
     @VisibleForTesting
-    public void setExtractAllPaksForTesting() {
-        List<String> pakFileAssets = new ArrayList<String>();
+    public void setExtractAllPaksAndV8SnapshotForTesting() {
+        List<String> pakAndSnapshotFileAssets = new ArrayList<String>();
         AssetManager manager = mContext.getResources().getAssets();
         try {
             String[] files = manager.list("");
             for (String file : files) {
-                if (file.endsWith(".pak")) pakFileAssets.add(file);
+                if (file.endsWith(".pak")) pakAndSnapshotFileAssets.add(file);
             }
         } catch (IOException e) {
             Log.w(LOGTAG, "Exception while accessing assets: " + e.getMessage(), e);
         }
-        setMandatoryPaksToExtract(pakFileAssets.toArray(new String[pakFileAssets.size()]));
+        pakAndSnapshotFileAssets.add("natives_blob.bin");
+        pakAndSnapshotFileAssets.add("snapshot_blob.bin");
+        setMandatoryPaksToExtract(pakAndSnapshotFileAssets.toArray(
+                new String[pakAndSnapshotFileAssets.size()]));
     }
 
     private ResourceExtractor(Context context) {
@@ -340,15 +349,27 @@
     /**
      * Pak files (UI strings and other resources) should be updated along with
      * Chrome. A version mismatch can lead to a rather broken user experience.
-     * The ICU data (icudtl.dat) is less version-sensitive, but still can
-     * lead to malfunction/UX misbehavior. So, we regard failing to update them
-     * as an error.
+     * Failing to update the V8 snapshot files will lead to a version mismatch
+     * between V8 and the loaded snapshot which will cause V8 to crash, so this
+     * is treated as an error. The ICU data (icudtl.dat) is less
+     * version-sensitive, but still can lead to malfunction/UX misbehavior. So,
+     * we regard failing to update them as an error.
      */
     private void deleteFiles() {
         File icudata = new File(getAppDataDir(), ICU_DATA_FILENAME);
         if (icudata.exists() && !icudata.delete()) {
             Log.e(LOGTAG, "Unable to remove the icudata " + icudata.getName());
         }
+        File v8_natives = new File(getAppDataDir(), V8_NATIVES_DATA_FILENAME);
+        if (v8_natives.exists() && !v8_natives.delete()) {
+            Log.e(LOGTAG,
+                    "Unable to remove the v8 data " + v8_natives.getName());
+        }
+        File v8_snapshot = new File(getAppDataDir(), V8_SNAPSHOT_DATA_FILENAME);
+        if (v8_snapshot.exists() && !v8_snapshot.delete()) {
+            Log.e(LOGTAG,
+                    "Unable to remove the v8 data " + v8_snapshot.getName());
+        }
         File dir = getOutputDir();
         if (dir.exists()) {
             File[] files = dir.listFiles();
diff --git a/base/android/java/src/org/chromium/base/SysUtils.java b/base/android/java/src/org/chromium/base/SysUtils.java
index eabef61..1c8378c 100644
--- a/base/android/java/src/org/chromium/base/SysUtils.java
+++ b/base/android/java/src/org/chromium/base/SysUtils.java
@@ -103,13 +103,12 @@
     }
 
     private static boolean detectLowEndDevice() {
-        if (CommandLine.isInitialized()) {
-            if (CommandLine.getInstance().hasSwitch(BaseSwitches.LOW_END_DEVICE_MODE)) {
-                int mode = Integer.parseInt(CommandLine.getInstance().getSwitchValue(
-                        BaseSwitches.LOW_END_DEVICE_MODE));
-                if (mode == 1) return true;
-                if (mode == 0) return false;
-            }
+        assert CommandLine.isInitialized();
+        if (CommandLine.getInstance().hasSwitch(BaseSwitches.LOW_END_DEVICE_MODE)) {
+            int mode = Integer.parseInt(CommandLine.getInstance().getSwitchValue(
+                    BaseSwitches.LOW_END_DEVICE_MODE));
+            if (mode == 1) return true;
+            if (mode == 0) return false;
         }
 
         if (Build.VERSION.SDK_INT <= ANDROID_LOW_MEMORY_ANDROID_SDK_THRESHOLD) {
diff --git a/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java b/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java
index dcf0754..c56d76c 100644
--- a/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java
+++ b/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java
@@ -50,9 +50,9 @@
     private static boolean sIsUsingBrowserSharedRelros = false;
     private static boolean sLoadAtFixedAddressFailed = false;
 
-    // One-way switch recording whether the device supports memory mapping
-    // APK files with executable permissions. Only used in the browser.
-    private static boolean sLibraryLoadFromApkSupported = false;
+    // One-way switch becomes true if the library was loaded from the APK file
+    // directly.
+    private static boolean sLibraryWasLoadedFromApk = false;
 
     // One-way switch becomes true if the system library loading failed,
     // and the right native library was found and loaded by the hack.
@@ -164,17 +164,10 @@
                     // Load libraries using the Chromium linker.
                     Linker.prepareLibraryLoad();
 
-                    // Check if the device supports loading a library directly from the APK file.
-                    String apkfile = context.getApplicationInfo().sourceDir;
-                    if (Linker.isInBrowserProcess()) {
-                        sLibraryLoadFromApkSupported = Linker.checkLibraryLoadFromApkSupport(
-                                apkfile);
-                    }
-
                     for (String library : NativeLibraries.LIBRARIES) {
                         String zipfile = null;
                         if (Linker.isInZipFile()) {
-                            zipfile = apkfile;
+                            zipfile = context.getApplicationInfo().sourceDir;
                             Log.i(TAG, "Loading " + library + " from within " + zipfile);
                         } else {
                             Log.i(TAG, "Loading: " + library);
@@ -186,6 +179,7 @@
                             try {
                                 if (zipfile != null) {
                                     Linker.loadLibraryInZipFile(zipfile, library);
+                                    sLibraryWasLoadedFromApk = true;
                                 } else {
                                     Linker.loadLibrary(library);
                                 }
@@ -200,6 +194,7 @@
                         if (!isLoaded) {
                             if (zipfile != null) {
                                 Linker.loadLibraryInZipFile(zipfile, library);
+                                sLibraryWasLoadedFromApk = true;
                             } else {
                                 Linker.loadLibrary(library);
                             }
@@ -308,27 +303,39 @@
 
     // Called after all native initializations are complete.
     public static void onNativeInitializationComplete(Context context) {
-        onNativeInitializationComplete();
-    }
-
-    // Called after all native initializations are complete.
-    @Deprecated
-    public static void onNativeInitializationComplete() {
-        recordBrowserProcessHistogram();
+        recordBrowserProcessHistogram(context);
         nativeRecordNativeLibraryHack(sNativeLibraryHackWasUsed);
     }
 
     // Record Chromium linker histogram state for the main browser process. Called from
     // onNativeInitializationComplete().
-    private static void recordBrowserProcessHistogram() {
+    private static void recordBrowserProcessHistogram(Context context) {
         if (Linker.isUsed()) {
-            assert Linker.isInBrowserProcess();
             nativeRecordChromiumAndroidLinkerBrowserHistogram(sIsUsingBrowserSharedRelros,
                                                               sLoadAtFixedAddressFailed,
-                                                              sLibraryLoadFromApkSupported);
+                                                              getLibraryLoadFromApkStatus(context));
         }
     }
 
+    // Returns the device's status for loading a library directly from the APK file.
+    // This method can only be called when the Chromium linker is used.
+    private static int getLibraryLoadFromApkStatus(Context context) {
+        assert Linker.isUsed();
+
+        if (sLibraryWasLoadedFromApk) {
+            return LibraryLoadFromApkStatusCodes.SUCCESSFUL;
+        }
+
+        if (context == null) {
+            Log.w(TAG, "Unknown APK filename due to null context");
+            return LibraryLoadFromApkStatusCodes.UNKNOWN;
+        }
+
+        return Linker.checkLibraryLoadFromApkSupport(context.getApplicationInfo().sourceDir) ?
+                LibraryLoadFromApkStatusCodes.SUPPORTED :
+                LibraryLoadFromApkStatusCodes.NOT_SUPPORTED;
+    }
+
     // Register pending Chromium linker histogram state for renderer processes. This cannot be
     // recorded as a histogram immediately because histograms and IPC are not ready at the
     // time it are captured. This function stores a pending value, so that a later call to
@@ -354,11 +361,11 @@
     // Method called to record statistics about the Chromium linker operation for the main
     // browser process. Indicates whether the linker attempted relro sharing for the browser,
     // and if it did, whether the library failed to load at a fixed address. Also records
-    // support for memory mapping APK files with executable permissions.
+    // support for loading a library directly from the APK file.
     private static native void nativeRecordChromiumAndroidLinkerBrowserHistogram(
             boolean isUsingBrowserSharedRelros,
             boolean loadAtFixedAddressFailed,
-            boolean apkMemoryMappingSupported);
+            int libraryLoadFromApkStatus);
 
     // Method called to register (for later recording) statistics about the Chromium linker
     // operation for a renderer process. Indicates whether the linker attempted relro sharing,
diff --git a/base/android/java/src/org/chromium/base/library_loader/Linker.java b/base/android/java/src/org/chromium/base/library_loader/Linker.java
index 41104f0..997b67c 100644
--- a/base/android/java/src/org/chromium/base/library_loader/Linker.java
+++ b/base/android/java/src/org/chromium/base/library_loader/Linker.java
@@ -196,6 +196,8 @@
     private static boolean sRelroSharingSupported = false;
 
     // Set to true if this runs in the browser process. Disabled by initServiceProcess().
+    // TODO(petrcermak): This flag can be incorrectly set to false (even though this might run in
+    // the browser process) on low-memory devices.
     private static boolean sInBrowserProcess = true;
 
     // Becomes true to indicate this process needs to wait for a shared RELRO in
@@ -230,6 +232,7 @@
                     System.loadLibrary(TAG);
                 } catch (UnsatisfiedLinkError  e) {
                     // In a component build, the ".cr" suffix is added to each library name.
+                    Log.w(TAG, "Couldn't load lib" + TAG + ".so, trying lib" + TAG + ".cr.so");
                     System.loadLibrary(TAG + ".cr");
                 }
                 sRelroSharingSupported = nativeCanUseSharedRelro();
@@ -382,19 +385,6 @@
     }
 
     /**
-     * Call this method to determine if the linker is running in the browser
-     * process.
-     *
-     * @return true if the linker is running in the browser process.
-     */
-    public static boolean isInBrowserProcess() {
-        synchronized (Linker.class) {
-            ensureInitializedLocked();
-            return sInBrowserProcess;
-        }
-    }
-
-    /**
      * Call this method to determine if the chromium project must load
      * the library directly from the zip file.
      */
@@ -838,6 +828,7 @@
      * @return true if supported.
      */
     public static boolean checkLibraryLoadFromApkSupport(String apkFile) {
+        assert apkFile != null;
         synchronized (Linker.class) {
             ensureInitializedLocked();
 
diff --git a/base/android/library_loader/library_load_from_apk_status_codes.h b/base/android/library_loader/library_load_from_apk_status_codes.h
new file mode 100644
index 0000000..73ddbd5
--- /dev/null
+++ b/base/android/library_loader/library_load_from_apk_status_codes.h
@@ -0,0 +1,36 @@
+// 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 BASE_ANDROID_LIBRARY_LOAD_FROM_APK_STATUS_CODES_H_
+#define BASE_ANDROID_LIBRARY_LOAD_FROM_APK_STATUS_CODES_H_
+
+namespace base {
+namespace android {
+
+namespace {
+
+// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.base.library_loader
+enum LibraryLoadFromApkStatusCodes {
+  // The loader was unable to determine whether the functionality is supported.
+  LIBRARY_LOAD_FROM_APK_STATUS_CODES_UNKNOWN = 0,
+
+  // The device does not support loading a library directly from the APK file.
+  LIBRARY_LOAD_FROM_APK_STATUS_CODES_NOT_SUPPORTED = 1,
+
+  // The device supports loading a library directly from the APK file.
+  LIBRARY_LOAD_FROM_APK_STATUS_CODES_SUPPORTED = 2,
+
+  // A library was successfully loaded directly from the APK file.
+  LIBRARY_LOAD_FROM_APK_STATUS_CODES_SUCCESSFUL = 3,
+
+  // End sentinel.
+  LIBRARY_LOAD_FROM_APK_STATUS_CODES_MAX = 4,
+};
+
+}  // namespace
+
+}  // namespace android
+}  // namespace base
+
+#endif  // BASE_ANDROID_LIBRARY_LOAD_FROM_APK_STATUS_CODES_H_
diff --git a/base/android/library_loader/library_loader_hooks.cc b/base/android/library_loader/library_loader_hooks.cc
index 819fe3d..809275d 100644
--- a/base/android/library_loader/library_loader_hooks.cc
+++ b/base/android/library_loader/library_loader_hooks.cc
@@ -6,6 +6,7 @@
 
 #include "base/android/command_line_android.h"
 #include "base/android/jni_string.h"
+#include "base/android/library_loader/library_load_from_apk_status_codes.h"
 #include "base/at_exit.h"
 #include "base/metrics/histogram.h"
 #include "jni/LibraryLoader_jni.h"
@@ -46,14 +47,6 @@
 
 RendererHistogramCode g_renderer_histogram_code = NO_PENDING_HISTOGRAM_CODE;
 
-enum LibraryLoadFromApkSupportCode {
-  // The device's support for loading a library directly from the APK file.
-  NOT_SUPPORTED = 0,
-  SUPPORTED = 1,
-
-  MAX_LIBRARY_LOAD_FROM_APK_SUPPORT_CODE = 2,
-};
-
 } // namespace
 
 static void RegisterChromiumAndroidLinkerRendererHistogram(
@@ -85,7 +78,7 @@
     jclass clazz,
     jboolean is_using_browser_shared_relros,
     jboolean load_at_fixed_address_failed,
-    jboolean library_load_from_apk_supported) {
+    jint library_load_from_apk_status) {
   // For low-memory devices, record whether or not we successfully loaded the
   // browser at a fixed address. Otherwise just record a normal invocation.
   BrowserHistogramCode histogram_code;
@@ -99,12 +92,10 @@
                             histogram_code,
                             MAX_BROWSER_HISTOGRAM_CODE);
 
-  // Record whether the device supports loading a library directly from the APK
-  // file.
-  UMA_HISTOGRAM_ENUMERATION("ChromiumAndroidLinker.LibraryLoadFromApkSupported",
-                            library_load_from_apk_supported ?
-                                SUPPORTED : NOT_SUPPORTED,
-                            MAX_LIBRARY_LOAD_FROM_APK_SUPPORT_CODE);
+  // Record the device support for loading a library directly from the APK file.
+  UMA_HISTOGRAM_ENUMERATION("ChromiumAndroidLinker.LibraryLoadFromApkStatus",
+                            library_load_from_apk_status,
+                            LIBRARY_LOAD_FROM_APK_STATUS_CODES_MAX);
 }
 
 void SetLibraryLoadedHook(LibraryLoadedHook* func) {
diff --git a/base/base.gyp b/base/base.gyp
index beb8995..42e270f 100644
--- a/base/base.gyp
+++ b/base/base.gyp
@@ -1344,6 +1344,7 @@
           },
           'dependencies': [
             'base_java_application_state',
+            'base_java_library_load_from_apk_status_codes',
             'base_java_memory_pressure_level',
             'base_native_libraries_gen',
           ],
@@ -1379,6 +1380,16 @@
         },
         {
           # GN: //base:base_android_java_enums_srcjar
+          'target_name': 'base_java_library_load_from_apk_status_codes',
+          'toolsets': ['host', 'target'],
+          'type': 'none',
+          'variables': {
+            'source_file': 'android/library_loader/library_load_from_apk_status_codes.h'
+          },
+          'includes': [ '../build/android/java_cpp_enum.gypi' ],
+        },
+        {
+          # GN: //base:base_android_java_enums_srcjar
           'target_name': 'base_java_memory_pressure_level',
           'type': 'none',
           'variables': {
diff --git a/base/base.gypi b/base/base.gypi
index 9542529..416a7e5 100644
--- a/base/base.gypi
+++ b/base/base.gypi
@@ -63,6 +63,7 @@
           'android/jni_weak_ref.h',
           'android/library_loader/library_loader_hooks.cc',
           'android/library_loader/library_loader_hooks.h',
+          'android/library_loader/library_load_from_apk_status_codes.h',
           'android/memory_pressure_listener_android.cc',
           'android/memory_pressure_listener_android.h',
           'android/java_handler_thread.cc',
@@ -496,10 +497,12 @@
           'process/process_metrics_win.cc',
           'process/process_posix.cc',
           'process/process_win.cc',
-          'profiler/scoped_profile.cc',
-          'profiler/scoped_profile.h',
           'profiler/alternate_timer.cc',
           'profiler/alternate_timer.h',
+          'profiler/scoped_profile.cc',
+          'profiler/scoped_profile.h',
+          'profiler/scoped_tracker.cc',
+          'profiler/scoped_tracker.h',
           'profiler/tracked_time.cc',
           'profiler/tracked_time.h',
           'rand_util.cc',
diff --git a/base/base_paths_win.cc b/base/base_paths_win.cc
index a9b31c7..5bef310 100644
--- a/base/base_paths_win.cc
+++ b/base/base_paths_win.cc
@@ -95,16 +95,6 @@
         return false;
       cur = FilePath(system_buffer);
       break;
-    case base::DIR_LOCAL_APP_DATA_LOW:
-      if (win::GetVersion() < win::VERSION_VISTA)
-        return false;
-
-      // TODO(nsylvain): We should use SHGetKnownFolderPath instead. Bug 1281128
-      if (FAILED(SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT,
-                                 system_buffer)))
-        return false;
-      cur = FilePath(system_buffer).DirName().AppendASCII("LocalLow");
-      break;
     case base::DIR_LOCAL_APP_DATA:
       if (FAILED(SHGetFolderPath(NULL, CSIDL_LOCAL_APPDATA, NULL,
                                  SHGFP_TYPE_CURRENT, system_buffer)))
diff --git a/base/base_paths_win.h b/base/base_paths_win.h
index 4620171..032de34 100644
--- a/base/base_paths_win.h
+++ b/base/base_paths_win.h
@@ -25,7 +25,6 @@
   DIR_START_MENU,         // Usually "C:\Documents and Settings\<user>\
                           // Start Menu\Programs"
   DIR_APP_DATA,           // Application Data directory under the user profile.
-  DIR_LOCAL_APP_DATA_LOW, // Local AppData directory for low integrity level.
   DIR_LOCAL_APP_DATA,     // "Local Settings\Application Data" directory under
                           // the user profile.
   DIR_COMMON_APP_DATA,    // W2K, XP, W2K3: "C:\Documents and Settings\
diff --git a/base/callback_internal.h b/base/callback_internal.h
index 9d7761c..b85973d 100644
--- a/base/callback_internal.h
+++ b/base/callback_internal.h
@@ -77,7 +77,7 @@
   template <typename U>
   static NoType Test(...);
 
-  static const bool value = sizeof(Test<T>(0)) == sizeof(YesType) &&
+  static const bool value = sizeof((Test<T>(0))) == sizeof(YesType) &&
                             !is_const<T>::value;
 };
 
diff --git a/base/debug/task_annotator.cc b/base/debug/task_annotator.cc
index f2e4b73..ae2d797 100644
--- a/base/debug/task_annotator.cc
+++ b/base/debug/task_annotator.cc
@@ -30,6 +30,7 @@
                             const PendingTask& pending_task) {
   tracked_objects::ThreadData::PrepareForStartOfRun(pending_task.birth_tally);
   tracked_objects::TaskStopwatch stopwatch;
+  stopwatch.Start();
   tracked_objects::Duration queue_duration =
       stopwatch.StartTime() - pending_task.EffectiveTimePosted();
 
diff --git a/base/debug/trace_event_impl.h b/base/debug/trace_event_impl.h
index 79bdc97..6075e2d 100644
--- a/base/debug/trace_event_impl.h
+++ b/base/debug/trace_event_impl.h
@@ -23,7 +23,6 @@
 #include "base/synchronization/lock.h"
 #include "base/threading/thread.h"
 #include "base/threading/thread_local.h"
-#include "base/timer/timer.h"
 
 // Older style trace macros with explicit id and extra data
 // Only these macros result in publishing data to ETW as currently implemented.
diff --git a/base/files/file_util_posix.cc b/base/files/file_util_posix.cc
index 5a94cef..d86d9bc 100644
--- a/base/files/file_util_posix.cc
+++ b/base/files/file_util_posix.cc
@@ -322,7 +322,9 @@
     }
 
     if (S_ISDIR(from_stat.st_mode)) {
-      if (mkdir(target_path.value().c_str(), from_stat.st_mode & 01777) != 0 &&
+      if (mkdir(target_path.value().c_str(),
+                (from_stat.st_mode & 01777) | S_IRUSR | S_IXUSR | S_IWUSR) !=
+              0 &&
           errno != EEXIST) {
         DLOG(ERROR) << "CopyDirectory() couldn't create directory: "
                     << target_path.value() << " errno = " << errno;
diff --git a/base/files/file_util_unittest.cc b/base/files/file_util_unittest.cc
index bd4839a..08c9587 100644
--- a/base/files/file_util_unittest.cc
+++ b/base/files/file_util_unittest.cc
@@ -1379,24 +1379,34 @@
 }
 
 // Sets the source file to read-only.
-void SetReadOnly(const FilePath& path) {
+void SetReadOnly(const FilePath& path, bool read_only) {
 #if defined(OS_WIN)
-  // On Windows, it involves setting a bit.
+  // On Windows, it involves setting/removing the 'readonly' bit.
   DWORD attrs = GetFileAttributes(path.value().c_str());
   ASSERT_NE(INVALID_FILE_ATTRIBUTES, attrs);
   ASSERT_TRUE(SetFileAttributes(
-      path.value().c_str(), attrs | FILE_ATTRIBUTE_READONLY));
-  attrs = GetFileAttributes(path.value().c_str());
+      path.value().c_str(),
+      read_only ? (attrs | FILE_ATTRIBUTE_READONLY) :
+          (attrs & ~FILE_ATTRIBUTE_READONLY)));
   // Files in the temporary directory should not be indexed ever. If this
   // assumption change, fix this unit test accordingly.
   // FILE_ATTRIBUTE_NOT_CONTENT_INDEXED doesn't exist on XP.
-  DWORD expected = FILE_ATTRIBUTE_ARCHIVE | FILE_ATTRIBUTE_READONLY;
+  DWORD expected = read_only ?
+      ((attrs & (FILE_ATTRIBUTE_ARCHIVE | FILE_ATTRIBUTE_DIRECTORY)) |
+          FILE_ATTRIBUTE_READONLY) :
+      (attrs & (FILE_ATTRIBUTE_ARCHIVE | FILE_ATTRIBUTE_DIRECTORY));
+  // TODO(ripp@yandex-team.ru): this seems out of place here. If we really think
+  // it is important to verify that temp files are not indexed there should be
+  // a dedicated test for that (create a file, inspect the attributes)
   if (win::GetVersion() >= win::VERSION_VISTA)
     expected |= FILE_ATTRIBUTE_NOT_CONTENT_INDEXED;
+  attrs = GetFileAttributes(path.value().c_str());
   ASSERT_EQ(expected, attrs);
 #else
-  // On all other platforms, it involves removing the write bit.
-  EXPECT_TRUE(SetPosixFilePermissions(path, S_IRUSR));
+  // On all other platforms, it involves removing/setting the write bit.
+  mode_t mode = read_only ? S_IRUSR : (S_IRUSR | S_IWUSR);
+  EXPECT_TRUE(SetPosixFilePermissions(
+      path, DirectoryExists(path) ? (mode | S_IXUSR) : mode));
 #endif
 }
 
@@ -1413,23 +1423,34 @@
 }
 
 TEST_F(FileUtilTest, CopyDirectoryACL) {
-  // Create a directory.
+  // Create source directories.
   FilePath src = temp_dir_.path().Append(FILE_PATH_LITERAL("src"));
-  CreateDirectory(src);
-  ASSERT_TRUE(PathExists(src));
+  FilePath src_subdir = src.Append(FILE_PATH_LITERAL("subdir"));
+  CreateDirectory(src_subdir);
+  ASSERT_TRUE(PathExists(src_subdir));
 
   // Create a file under the directory.
   FilePath src_file = src.Append(FILE_PATH_LITERAL("src.txt"));
   CreateTextFile(src_file, L"Gooooooooooooooooooooogle");
-  SetReadOnly(src_file);
+  SetReadOnly(src_file, true);
   ASSERT_TRUE(IsReadOnly(src_file));
 
+  // Make directory read-only.
+  SetReadOnly(src_subdir, true);
+  ASSERT_TRUE(IsReadOnly(src_subdir));
+
   // Copy the directory recursively.
   FilePath dst = temp_dir_.path().Append(FILE_PATH_LITERAL("dst"));
   FilePath dst_file = dst.Append(FILE_PATH_LITERAL("src.txt"));
   EXPECT_TRUE(CopyDirectory(src, dst, true));
 
+  FilePath dst_subdir = dst.Append(FILE_PATH_LITERAL("subdir"));
+  ASSERT_FALSE(IsReadOnly(dst_subdir));
   ASSERT_FALSE(IsReadOnly(dst_file));
+
+  // Give write permissions to allow deletion.
+  SetReadOnly(src_subdir, false);
+  ASSERT_FALSE(IsReadOnly(src_subdir));
 }
 
 TEST_F(FileUtilTest, CopyFile) {
@@ -1480,7 +1501,7 @@
 
   // Set the source file to read-only.
   ASSERT_FALSE(IsReadOnly(src));
-  SetReadOnly(src);
+  SetReadOnly(src, true);
   ASSERT_TRUE(IsReadOnly(src));
 
   // Copy the file.
diff --git a/base/logging.h b/base/logging.h
index 54ff579..6a1df76 100644
--- a/base/logging.h
+++ b/base/logging.h
@@ -701,7 +701,7 @@
 #define DCHECK_GT(val1, val2) DCHECK_OP(GT, > , val1, val2)
 #define DCHECK_IMPLIES(val1, val2) DCHECK(!(val1) || (val2))
 
-#if defined(NDEBUG) && defined(OS_CHROMEOS)
+#if !DCHECK_IS_ON && defined(OS_CHROMEOS)
 #define NOTREACHED() LOG(ERROR) << "NOTREACHED() hit in " << \
     __FUNCTION__ << ". "
 #else
diff --git a/base/path_service_unittest.cc b/base/path_service_unittest.cc
index c6cc0e6..543deb6 100644
--- a/base/path_service_unittest.cc
+++ b/base/path_service_unittest.cc
@@ -98,18 +98,8 @@
 #if defined(OS_WIN)
   for (int key = base::PATH_WIN_START + 1; key < base::PATH_WIN_END; ++key) {
     bool valid = true;
-    switch(key) {
-      case base::DIR_LOCAL_APP_DATA_LOW:
-        // DIR_LOCAL_APP_DATA_LOW is not supported prior Vista and is expected
-        // to fail.
-        valid = base::win::GetVersion() >= base::win::VERSION_VISTA;
-        break;
-      case base::DIR_APP_SHORTCUTS:
-        // DIR_APP_SHORTCUTS is not supported prior Windows 8 and is expected to
-        // fail.
-        valid = base::win::GetVersion() >= base::win::VERSION_WIN8;
-        break;
-    }
+    if (key == base::DIR_APP_SHORTCUTS)
+      valid = base::win::GetVersion() >= base::win::VERSION_WIN8;
 
     if (valid)
       EXPECT_TRUE(ReturnsValidPath(key)) << key;
diff --git a/base/posix/eintr_wrapper.h b/base/posix/eintr_wrapper.h
index 854c43a..5a5dc75 100644
--- a/base/posix/eintr_wrapper.h
+++ b/base/posix/eintr_wrapper.h
@@ -25,7 +25,7 @@
 #if defined(NDEBUG)
 
 #define HANDLE_EINTR(x) ({ \
-  typeof(x) eintr_wrapper_result; \
+  decltype(x) eintr_wrapper_result; \
   do { \
     eintr_wrapper_result = (x); \
   } while (eintr_wrapper_result == -1 && errno == EINTR); \
@@ -36,7 +36,7 @@
 
 #define HANDLE_EINTR(x) ({ \
   int eintr_wrapper_counter = 0; \
-  typeof(x) eintr_wrapper_result; \
+  decltype(x) eintr_wrapper_result; \
   do { \
     eintr_wrapper_result = (x); \
   } while (eintr_wrapper_result == -1 && errno == EINTR && \
@@ -47,7 +47,7 @@
 #endif  // NDEBUG
 
 #define IGNORE_EINTR(x) ({ \
-  typeof(x) eintr_wrapper_result; \
+  decltype(x) eintr_wrapper_result; \
   do { \
     eintr_wrapper_result = (x); \
     if (eintr_wrapper_result == -1 && errno == EINTR) { \
diff --git a/base/profiler/scoped_profile.cc b/base/profiler/scoped_profile.cc
index e1edc97..8b0ae59 100644
--- a/base/profiler/scoped_profile.cc
+++ b/base/profiler/scoped_profile.cc
@@ -13,20 +13,32 @@
 
 ScopedProfile::ScopedProfile(const Location& location)
     : birth_(ThreadData::TallyABirthIfActive(location)) {
+  if (!birth_)
+    return;
+
   ThreadData::PrepareForStartOfRun(birth_);
+  stopwatch_.Start();
+}
+
+ScopedProfile::ScopedProfile(const Location& location, Mode mode)
+    : birth_(NULL) {
+  if (mode == DISABLED)
+    return;
+
+  birth_ = ThreadData::TallyABirthIfActive(location);
+  if (!birth_)
+    return;
+
+  ThreadData::PrepareForStartOfRun(birth_);
+  stopwatch_.Start();
 }
 
 ScopedProfile::~ScopedProfile() {
-  StopClockAndTally();
-}
-
-void ScopedProfile::StopClockAndTally() {
-  stopwatch_.Stop();
-
   if (!birth_)
     return;
+
+  stopwatch_.Stop();
   ThreadData::TallyRunInAScopedRegionIfTracking(birth_, stopwatch_);
-  birth_ = NULL;
 }
 
 }  // namespace tracked_objects
diff --git a/base/profiler/scoped_profile.h b/base/profiler/scoped_profile.h
index 7290908..6a76486 100644
--- a/base/profiler/scoped_profile.h
+++ b/base/profiler/scoped_profile.h
@@ -35,11 +35,17 @@
 
 class BASE_EXPORT ScopedProfile {
  public:
-  explicit ScopedProfile(const Location& location);
-  ~ScopedProfile();
+  // Mode of operation. Specifies whether ScopedProfile should be a no-op or
+  // needs to create and tally a task.
+  enum Mode {
+    DISABLED,  // Do nothing.
+    ENABLED    // Create and tally a task.
+  };
 
-  // Stop tracing prior to the end destruction of the instance.
-  void StopClockAndTally();
+  // TODO(vadimt): Remove this constructor.
+  explicit ScopedProfile(const Location& location);
+  ScopedProfile(const Location& location, Mode mode);
+  ~ScopedProfile();
 
  private:
   Births* birth_;  // Place in code where tracking started.
diff --git a/base/profiler/scoped_tracker.cc b/base/profiler/scoped_tracker.cc
new file mode 100644
index 0000000..5cd0bca
--- /dev/null
+++ b/base/profiler/scoped_tracker.cc
@@ -0,0 +1,24 @@
+// 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 "base/profiler/scoped_tracker.h"
+
+namespace tracked_objects {
+
+namespace {
+
+ScopedProfile::Mode g_scoped_profile_mode = ScopedProfile::DISABLED;
+
+}  // namespace
+
+// static
+void ScopedTracker::Enable() {
+  g_scoped_profile_mode = ScopedProfile::ENABLED;
+}
+
+ScopedTracker::ScopedTracker(const Location& location)
+    : scoped_profile_(location, g_scoped_profile_mode) {
+}
+
+}  // namespace tracked_objects
diff --git a/base/profiler/scoped_tracker.h b/base/profiler/scoped_tracker.h
new file mode 100644
index 0000000..fbd7309
--- /dev/null
+++ b/base/profiler/scoped_tracker.h
@@ -0,0 +1,37 @@
+// 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 BASE_PROFILER_SCOPED_TRACKER_H_
+#define BASE_PROFILER_SCOPED_TRACKER_H_
+
+//------------------------------------------------------------------------------
+// Utilities for temporarily instrumenting code to dig into issues that were
+// found using profiler data.
+
+#include "base/base_export.h"
+#include "base/location.h"
+#include "base/profiler/scoped_profile.h"
+
+namespace tracked_objects {
+
+// ScopedTracker instruments a region within the code if the instrumentation is
+// enabled. It can be used, for example, to find out if a source of jankiness is
+// inside the instrumented code region.
+class BASE_EXPORT ScopedTracker {
+ public:
+  ScopedTracker(const Location& location);
+
+  // Enables instrumentation for the remainder of the current process' life. If
+  // this function is not called, all profiler instrumentations are no-ops.
+  static void Enable();
+
+ private:
+  const ScopedProfile scoped_profile_;
+
+  DISALLOW_COPY_AND_ASSIGN(ScopedTracker);
+};
+
+}  // namespace tracked_objects
+
+#endif  // BASE_PROFILER_SCOPED_TRACKER_H_
diff --git a/base/run_loop.cc b/base/run_loop.cc
index e92e110..2aa4def 100644
--- a/base/run_loop.cc
+++ b/base/run_loop.cc
@@ -51,6 +51,7 @@
   // Use task stopwatch to exclude the loop run time from the current task, if
   // any.
   tracked_objects::TaskStopwatch stopwatch;
+  stopwatch.Start();
   loop_->RunHandler();
   stopwatch.Stop();
 
diff --git a/base/scoped_observer.h b/base/scoped_observer.h
index 3754ed5..5b0d533 100644
--- a/base/scoped_observer.h
+++ b/base/scoped_observer.h
@@ -9,6 +9,7 @@
 #include <vector>
 
 #include "base/basictypes.h"
+#include "base/logging.h"
 
 // ScopedObserver is used to keep track of the set of sources an object has
 // attached itself to as an observer. When ScopedObserver is destroyed it
@@ -30,7 +31,9 @@
 
   // Remove the object passed to the constructor as an observer from |source|.
   void Remove(Source* source) {
-    sources_.erase(std::find(sources_.begin(), sources_.end(), source));
+    auto it = std::find(sources_.begin(), sources_.end(), source);
+    DCHECK(it != sources_.end());
+    sources_.erase(it);
     source->RemoveObserver(observer_);
   }
 
diff --git a/base/test/trace_to_file.cc b/base/test/trace_to_file.cc
index 423f65c..e157c85 100644
--- a/base/test/trace_to_file.cc
+++ b/base/test/trace_to_file.cc
@@ -5,6 +5,7 @@
 #include "base/test/trace_to_file.h"
 
 #include "base/base_switches.h"
+#include "base/bind.h"
 #include "base/command_line.h"
 #include "base/debug/trace_event_impl.h"
 #include "base/files/file_util.h"
diff --git a/base/third_party/nspr/BUILD.gn b/base/third_party/nspr/BUILD.gn
index ddbcbc1..516ca1f 100644
--- a/base/third_party/nspr/BUILD.gn
+++ b/base/third_party/nspr/BUILD.gn
@@ -3,7 +3,7 @@
 # found in the LICENSE file.
 
 source_set("nspr") {
-  visibility = [ "//base/*" ]
+  visibility = [ "//base" ]
   sources = [
     "prtime.cc",
     "prtime.h",
diff --git a/base/threading/sequenced_worker_pool.cc b/base/threading/sequenced_worker_pool.cc
index 08ef5f0..4c37320 100644
--- a/base/threading/sequenced_worker_pool.cc
+++ b/base/threading/sequenced_worker_pool.cc
@@ -756,6 +756,7 @@
 
           tracked_objects::ThreadData::PrepareForStartOfRun(task.birth_tally);
           tracked_objects::TaskStopwatch stopwatch;
+          stopwatch.Start();
           task.task.Run();
           stopwatch.Stop();
 
diff --git a/base/threading/worker_pool_posix.cc b/base/threading/worker_pool_posix.cc
index f54b7ec..cd3c9dc 100644
--- a/base/threading/worker_pool_posix.cc
+++ b/base/threading/worker_pool_posix.cc
@@ -97,6 +97,7 @@
 
     tracked_objects::ThreadData::PrepareForStartOfRun(pending_task.birth_tally);
     tracked_objects::TaskStopwatch stopwatch;
+    stopwatch.Start();
     pending_task.task.Run();
     stopwatch.Stop();
 
diff --git a/base/threading/worker_pool_win.cc b/base/threading/worker_pool_win.cc
index 8fc7324..ff3cc83 100644
--- a/base/threading/worker_pool_win.cc
+++ b/base/threading/worker_pool_win.cc
@@ -30,6 +30,7 @@
   g_worker_pool_running_on_this_thread.Get().Set(true);
 
   tracked_objects::TaskStopwatch stopwatch;
+  stopwatch.Start();
   pending_task->task.Run();
   stopwatch.Stop();
 
diff --git a/base/tracked_objects.cc b/base/tracked_objects.cc
index 659d421..4fe8851 100644
--- a/base/tracked_objects.cc
+++ b/base/tracked_objects.cc
@@ -854,16 +854,32 @@
 
 //------------------------------------------------------------------------------
 TaskStopwatch::TaskStopwatch()
-    : start_time_(ThreadData::Now()),
-      current_thread_data_(ThreadData::Get()),
+    : wallclock_duration_ms_(0),
+      current_thread_data_(NULL),
       excluded_duration_ms_(0),
       parent_(NULL) {
 #if DCHECK_IS_ON
-  state_ = RUNNING;
+  state_ = CREATED;
   child_ = NULL;
 #endif
+}
 
-  wallclock_duration_ms_ = 0;
+TaskStopwatch::~TaskStopwatch() {
+#if DCHECK_IS_ON
+  DCHECK(state_ != RUNNING);
+  DCHECK(child_ == NULL);
+#endif
+}
+
+void TaskStopwatch::Start() {
+#if DCHECK_IS_ON
+  DCHECK(state_ == CREATED);
+  state_ = RUNNING;
+#endif
+
+  start_time_ = ThreadData::Now();
+
+  current_thread_data_ = ThreadData::Get();
   if (!current_thread_data_)
     return;
 
@@ -878,13 +894,6 @@
   current_thread_data_->current_stopwatch_ = this;
 }
 
-TaskStopwatch::~TaskStopwatch() {
-#if DCHECK_IS_ON
-  DCHECK(state_ != RUNNING);
-  DCHECK(child_ == NULL);
-#endif
-}
-
 void TaskStopwatch::Stop() {
   const TrackedTime end_time = ThreadData::Now();
 #if DCHECK_IS_ON
@@ -910,12 +919,15 @@
   DCHECK(parent_->child_ == this);
   parent_->child_ = NULL;
 #endif
-  parent_->excluded_duration_ms_ +=
-      wallclock_duration_ms_;
+  parent_->excluded_duration_ms_ += wallclock_duration_ms_;
   parent_ = NULL;
 }
 
 TrackedTime TaskStopwatch::StartTime() const {
+#if DCHECK_IS_ON
+  DCHECK(state_ != CREATED);
+#endif
+
   return start_time_;
 }
 
@@ -928,6 +940,10 @@
 }
 
 ThreadData* TaskStopwatch::GetThreadData() const {
+#if DCHECK_IS_ON
+  DCHECK(state_ != CREATED);
+#endif
+
   return current_thread_data_;
 }
 
diff --git a/base/tracked_objects.h b/base/tracked_objects.h
index 055cf19..222f581 100644
--- a/base/tracked_objects.h
+++ b/base/tracked_objects.h
@@ -709,6 +709,9 @@
   TaskStopwatch();
   ~TaskStopwatch();
 
+  // Starts stopwatch.
+  void Start();
+
   // Stops stopwatch.
   void Stop();
 
@@ -744,12 +747,9 @@
   TaskStopwatch* parent_;
 
 #if DCHECK_IS_ON
-  // State of the stopwatch. Stopwatch is first constructed in a running state,
-  // then stopped, then destructed.
-  enum {
-    RUNNING,
-    STOPPED
-  } state_;
+  // State of the stopwatch. Stopwatch is first constructed in a created state
+  // state, then is optionally started/stopped, then destructed.
+  enum { CREATED, RUNNING, STOPPED } state_;
 
   // Currently running stopwatch that is directly nested in this one, if such
   // stopwatch exists. NULL otherwise.
diff --git a/base/tracked_objects_unittest.cc b/base/tracked_objects_unittest.cc
index 3ca7d74..f19ba7b 100644
--- a/base/tracked_objects_unittest.cc
+++ b/base/tracked_objects_unittest.cc
@@ -111,6 +111,16 @@
 // static
 unsigned int TrackedObjectsTest::test_time_;
 
+TEST_F(TrackedObjectsTest, TaskStopwatchNoStartStop) {
+  if (!ThreadData::InitializeAndSetTrackingStatus(
+          ThreadData::PROFILING_CHILDREN_ACTIVE)) {
+    return;
+  }
+
+  // Check that creating and destroying a stopwatch without starting it doesn't
+  // crash.
+  TaskStopwatch stopwatch;
+}
 
 TEST_F(TrackedObjectsTest, MinimalStartupShutdown) {
   // Minimal test doesn't even create any tasks.
@@ -190,6 +200,7 @@
   base::TrackingInfo pending_task(location, kBogusBirthTime);
   SetTestTime(1);
   TaskStopwatch stopwatch;
+  stopwatch.Start();
   // Finally conclude the outer run.
   const int32 time_elapsed = 1000;
   SetTestTime(start_time + time_elapsed);
@@ -382,6 +393,7 @@
   const unsigned int kEndOfRun = 7;
   SetTestTime(kStartOfRun);
   TaskStopwatch stopwatch;
+  stopwatch.Start();
   SetTestTime(kEndOfRun);
   stopwatch.Stop();
 
@@ -422,6 +434,7 @@
   const unsigned int kEndOfRun = 7;
   SetTestTime(kStartOfRun);
   TaskStopwatch stopwatch;
+  stopwatch.Start();
   SetTestTime(kEndOfRun);
   stopwatch.Stop();
 
@@ -456,6 +469,7 @@
   const unsigned int kEndOfRun = 7;
   SetTestTime(kStartOfRun);
   TaskStopwatch stopwatch;
+  stopwatch.Start();
   SetTestTime(kEndOfRun);
   stopwatch.Stop();
 
@@ -485,6 +499,7 @@
   const unsigned int kEndOfRun = 7;
   SetTestTime(kStartOfRun);
   TaskStopwatch stopwatch;
+  stopwatch.Start();
   SetTestTime(kEndOfRun);
   stopwatch.Stop();
 
@@ -552,6 +567,7 @@
   const unsigned int kEndOfRun = 7;
   SetTestTime(kStartOfRun);
   TaskStopwatch stopwatch;
+  stopwatch.Start();
   SetTestTime(kEndOfRun);
   stopwatch.Stop();
 
@@ -562,6 +578,7 @@
   pending_task2.time_posted = kTimePosted;  // Overwrite implied Now().
   SetTestTime(kStartOfRun);
   TaskStopwatch stopwatch2;
+  stopwatch2.Start();
   SetTestTime(kEndOfRun);
   stopwatch2.Stop();
 
@@ -595,6 +612,7 @@
   const unsigned int kEndOfRun = 7;
   SetTestTime(kStartOfRun);
   TaskStopwatch stopwatch;
+  stopwatch.Start();
   SetTestTime(kEndOfRun);
   stopwatch.Stop();
 
@@ -659,9 +677,11 @@
 
   SetTestTime(5);
   TaskStopwatch task_stopwatch;
+  task_stopwatch.Start();
   {
     SetTestTime(8);
     TaskStopwatch exclusion_stopwatch;
+    exclusion_stopwatch.Start();
     SetTestTime(12);
     exclusion_stopwatch.Stop();
   }
@@ -695,14 +715,17 @@
 
   SetTestTime(5);
   TaskStopwatch task_stopwatch;
+  task_stopwatch.Start();
   {
     SetTestTime(8);
     TaskStopwatch exclusion_stopwatch;
+    exclusion_stopwatch.Start();
     SetTestTime(12);
     exclusion_stopwatch.Stop();
 
     SetTestTime(15);
     TaskStopwatch exclusion_stopwatch2;
+    exclusion_stopwatch2.Start();
     SetTestTime(18);
     exclusion_stopwatch2.Stop();
   }
@@ -739,9 +762,11 @@
 
   SetTestTime(5);
   TaskStopwatch task_stopwatch;
+  task_stopwatch.Start();
   {
     SetTestTime(8);
     TaskStopwatch exclusion_stopwatch;
+    exclusion_stopwatch.Start();
     {
       Location second_location(kFunction, kFile, kSecondFakeLineNumber, NULL);
       base::TrackingInfo nested_task(second_location, kDelayedStartTime);
@@ -750,6 +775,7 @@
           base::TimeTicks() + base::TimeDelta::FromMilliseconds(8);
       SetTestTime(9);
       TaskStopwatch nested_task_stopwatch;
+      nested_task_stopwatch.Start();
       SetTestTime(11);
       nested_task_stopwatch.Stop();
       ThreadData::TallyRunOnNamedThreadIfTracking(
diff --git a/build/all.gyp b/build/all.gyp
index f421983..c58abf6 100644
--- a/build/all.gyp
+++ b/build/all.gyp
@@ -64,8 +64,6 @@
         ['OS=="android"', {
           'dependencies': [
             '../content/content_shell_and_tests.gyp:content_shell_apk',
-            '../mojo/mojo.gyp:mojo_shell_apk',
-            '../mojo/mojo_base.gyp:mojo_test_apk',
             '<@(android_app_targets)',
             'android_builder_tests',
             '../android_webview/android_webview.gyp:android_webview_apk',
@@ -355,6 +353,7 @@
         }],
         ['OS=="win"', {
           'dependencies': [
+            '../chrome/chrome.gyp:app_installer',
             '../chrome/chrome.gyp:crash_service',
             '../chrome/chrome.gyp:installer_util_unittests',
             # ../chrome/test/mini_installer requires mini_installer.
@@ -1180,6 +1179,9 @@
               'type': 'none',
               'dependencies': [
                 '../base/base.gyp:base_unittests',
+                # TODO(jackhou): Ensure that app_installer builds on trybots
+                # and waterfall, then de-comment here.
+                #'../chrome/chrome.gyp:app_installer',
                 '../chrome/chrome.gyp:browser_tests',
                 '../chrome/chrome.gyp:sync_integration_tests',
                 '../chrome/chrome.gyp:crash_service',
diff --git a/build/android/buildbot/bb_device_steps.py b/build/android/buildbot/bb_device_steps.py
index 6a7c90b..d113842 100755
--- a/build/android/buildbot/bb_device_steps.py
+++ b/build/android/buildbot/bb_device_steps.py
@@ -73,9 +73,14 @@
       'org.chromium.android_webview.shell',
       'AndroidWebViewTest',
       'webview:android_webview/test/data/device_files'),
+    I('ChromeSyncShell',
+      'ChromeSyncShell.apk',
+      'org.chromium.chrome.browser.sync',
+      'ChromeSyncShellTest',
+      None),
     ])
 
-VALID_TESTS = set(['chromedriver', 'chrome_proxy', 'gpu', 'sync',
+VALID_TESTS = set(['chromedriver', 'chrome_proxy', 'gpu',
                    'telemetry_perf_unittests', 'ui', 'unit', 'webkit',
                    'webkit_layout', 'python_unittests'])
 
@@ -184,14 +189,6 @@
   bb_annotations.PrintNamedStep('chrome_proxy')
   RunCmd(['tools/chrome_proxy/run_tests'] + args)
 
-def RunChromeSyncShellTests(options):
-  """Run the chrome sync shell tests"""
-  test = I('ChromeSyncShell',
-           'ChromeSyncShell.apk',
-           'org.chromium.chrome.browser.sync',
-           'ChromeSyncShellTest',
-           'chrome:chrome/test/data/android/device_files')
-  RunInstrumentationSuite(options, test)
 
 def RunTelemetryPerfUnitTests(options):
   """Runs the telemetry perf unit tests.
@@ -532,7 +529,6 @@
       ('chrome_proxy', RunChromeProxyTests),
       ('gpu', RunGPUTests),
       ('python_unittests', RunPythonUnitTests),
-      ('sync', RunChromeSyncShellTests),
       ('telemetry_perf_unittests', RunTelemetryPerfUnitTests),
       ('ui', RunInstrumentationTests),
       ('unit', RunUnitTests),
diff --git a/build/android/buildbot/bb_run_bot.py b/build/android/buildbot/bb_run_bot.py
index 28ccfba..38678d1 100755
--- a/build/android/buildbot/bb_run_bot.py
+++ b/build/android/buildbot/bb_run_bot.py
@@ -116,7 +116,6 @@
 def GetBotStepMap():
   compile_step = ['compile']
   chrome_proxy_tests = ['chrome_proxy']
-  chrome_sync_shell_tests = ['sync']
   python_unittests = ['python_unittests']
   std_host_tests = ['check_webview_licenses', 'findbugs']
   emma_coverage_tests = [x for x in std_host_tests if x is not 'findbugs']
@@ -168,7 +167,7 @@
         H(compile_step + std_host_tests, target_arch='ia32')),
       B('fyi-builder-rel', H(std_build_steps,  experimental)),
       B('fyi-tests', H(std_test_steps),
-        T(std_tests + chrome_sync_shell_tests + python_unittests,
+        T(std_tests + python_unittests,
                       ['--experimental', flakiness_server,
                       '--coverage-bucket', CHROMIUM_COVERAGE_BUCKET,
                       '--cleanup'])),
diff --git a/build/android/pylib/gtest/filter/content_unittests_disabled b/build/android/pylib/gtest/filter/content_unittests_disabled
index 4427849..925a7d1 100644
--- a/build/android/pylib/gtest/filter/content_unittests_disabled
+++ b/build/android/pylib/gtest/filter/content_unittests_disabled
@@ -1,8 +1,5 @@
 # List of suppressions
 
-# crbug.com/104950
-DeviceOrientationProviderTest.ObserverNotRemoved
-DeviceOrientationProviderTest.StartFailing
 # crbug.com/139095
 RenderWidgetTest.OnMsgPaintAtSize
 # crbug.com/147549
diff --git a/build/android/pylib/gtest/setup.py b/build/android/pylib/gtest/setup.py
index c3af91f..5581fbc 100644
--- a/build/android/pylib/gtest/setup.py
+++ b/build/android/pylib/gtest/setup.py
@@ -122,6 +122,7 @@
       '--config-variable', 'fastbuild', '0',
       '--config-variable', 'icu_use_data_file_flag', '1',
       '--config-variable', 'libpeer_target_type', 'static_library',
+      '--config-variable', 'v8_use_external_startup_data', '0',
       '--config-variable', 'lsan', '0',
       # TODO(maruel): This may not be always true.
       '--config-variable', 'target_arch', 'arm',
diff --git a/build/build_config.h b/build/build_config.h
index 5534846..b07660d 100644
--- a/build/build_config.h
+++ b/build/build_config.h
@@ -4,7 +4,8 @@
 
 // This file adds defines about the platform we're currently building on.
 //  Operating System:
-//    OS_WIN / OS_MACOSX / OS_LINUX / OS_POSIX (MACOSX or LINUX) / OS_NACL
+//    OS_WIN / OS_MACOSX / OS_LINUX / OS_POSIX (MACOSX or LINUX) /
+//    OS_NACL (NACL_SFI or NACL_NONSFI) / OS_NACL_SFI / OS_NACL_NONSFI
 //  Compiler:
 //    COMPILER_MSVC / COMPILER_GCC
 //  Processor:
@@ -18,6 +19,14 @@
 #if defined(__native_client__)
 // __native_client__ must be first, so that other OS_ defines are not set.
 #define OS_NACL 1
+// OS_NACL comes in two sandboxing technology flavors, SFI or Non-SFI.
+// PNaCl toolchain defines __native_client_nonsfi__ macro in Non-SFI build
+// mode, while it does not in SFI build mode.
+#if defined(__native_client_nonsfi__)
+#define OS_NACL_NONSFI
+#else
+#define OS_NACL_SFI
+#endif
 #elif defined(ANDROID)
 #define OS_ANDROID 1
 #elif defined(__APPLE__)
diff --git a/build/common.gypi b/build/common.gypi
index 708e12c..b32ca54 100644
--- a/build/common.gypi
+++ b/build/common.gypi
@@ -346,6 +346,10 @@
       # by the GYP command line or by ~/.gyp/include.gypi.
       'component%': 'static_library',
 
+      # /analyze is off by default on Windows because it is very slow and noisy.
+      # Enable with GYP_DEFINES=win_analyze=1
+      'win_analyze%': 0,
+
       # Set to select the Title Case versions of strings in GRD files.
       'use_titlecase_in_grd%': 0,
 
@@ -1004,6 +1008,14 @@
         }, {
           'optimize_jni_generation%': 0,
         }],
+
+        # TODO(baixo): Enable v8_use_external_startup_data
+        # http://crbug.com/421063
+        ['android_webview_build==0 and android_webview_telemetry_build==0 and chromecast==0', {
+          'v8_use_external_startup_data': 0,
+        }, {
+          'v8_use_external_startup_data': 0,
+        }],
       ],
 
       # Set this to 1 to enable use of concatenated impulse responses
@@ -1108,6 +1120,7 @@
     'chroot_cmd%': '<(chroot_cmd)',
     'system_libdir%': '<(system_libdir)',
     'component%': '<(component)',
+    'win_analyze%': '<(win_analyze)',
     'enable_resource_whitelist_generation%': '<(enable_resource_whitelist_generation)',
     'use_titlecase_in_grd%': '<(use_titlecase_in_grd)',
     'use_third_party_translations%': '<(use_third_party_translations)',
@@ -1205,6 +1218,7 @@
     'video_hole%': '<(video_hole)',
     'enable_load_completion_hacks%': '<(enable_load_completion_hacks)',
     'support_pre_M6_history_database%': '<(support_pre_M6_history_database)',
+    'v8_use_external_startup_data': '<(v8_use_external_startup_data)',
 
     # Whether or not we are building the Athena shell.
     'use_athena%': '0',
@@ -1354,9 +1368,6 @@
     # Enable new NPDevice API.
     'enable_new_npdevice_api%': 0,
 
-    # Enable EGLImage support in OpenMAX
-    'enable_eglimage%': 1,
-
     # .gyp files or targets should set chromium_code to 1 if they build
     # Chromium-specific code, as opposed to external code.  This variable is
     # used to control such things as the set of warnings to enable, and
@@ -1460,9 +1471,6 @@
     # Compile d8 for the host toolset.
     'v8_toolset_for_d8': 'host',
 
-    # Use the chromium skia by default.
-    'use_system_skia%': '0',
-
     # Use brlapi from brltty for braille display support.
     'use_brlapi%': 0,
 
@@ -2753,11 +2761,6 @@
           }],
         ],
       }],
-      ['enable_eglimage==1', {
-        'defines': [
-          'ENABLE_EGLIMAGE=1',
-        ],
-      }],
       ['asan==1', {
         'defines': [
           'ADDRESS_SANITIZER',
@@ -2804,8 +2807,42 @@
                 'DebugInformationFormat': '1',
               }
             }
-          }],
-        ],  # win_z7!=0
+          }],  # win_z7!=0
+          ['win_analyze', {
+            'defines!': [
+              # This is prohibited when running /analyze.
+              '_USING_V110_SDK71_',
+            ],
+            'msvs_settings': {
+              'VCCLCompilerTool': {
+                # Set WarnAsError to false to disable this setting for most
+                # projects so that compilation continues.
+                'WarnAsError': 'false',
+                # When win_analyze is specified add the /analyze switch.
+                # Also add /WX- to force-disable WarnAsError for projects that
+                # override WarnAsError.
+                # Also, disable various noisy warnings that have low value.
+                'AdditionalOptions': [
+                  '/analyze',
+                  '/WX-',
+                  '/wd6011',  # Dereferencing NULL pointer
+                  '/wd6312',  # Possible infinite loop: use of the constant
+                    # EXCEPTION_CONTINUE_EXECUTION in the exception-filter
+                  '/wd6326',  # Potential comparison of constant with constant
+                  '/wd28159', # Consider using 'GetTickCount64'
+                  '/wd28204', # Inconsistent SAL annotations
+                  '/wd28251', # Inconsistent SAL annotations
+                  '/wd28252', # Inconsistent SAL annotations
+                  '/wd28253', # Inconsistent SAL annotations
+                  '/wd28196', # The precondition is not satisfied
+                  '/wd28301', # Inconsistent SAL annotations
+                  '/wd6340',  # Sign mismatch in function parameter
+                  '/wd28182', # Dereferencing NULL pointer
+                ],
+              },
+            },
+          }],  # win_analyze
+        ],
       }],  # OS==win
       ['chromecast==1', {
         'defines': [
@@ -2933,6 +2970,9 @@
       ['enable_load_completion_hacks==1', {
         'defines': ['ENABLE_LOAD_COMPLETION_HACKS=1'],
       }],
+      ['v8_use_external_startup_data==1', {
+       'defines': ['V8_USE_EXTERNAL_STARTUP_DATA'],
+      }],
     ],  # conditions for 'target_defaults'
     'target_conditions': [
       ['<(use_openssl)==1', {
diff --git a/build/config/BUILD.gn b/build/config/BUILD.gn
index 64abdf3..d4629ea 100644
--- a/build/config/BUILD.gn
+++ b/build/config/BUILD.gn
@@ -31,7 +31,6 @@
   # TODO(brettw) most of these need to be parameterized.
   defines = [
       "CHROMIUM_BUILD",
-      "ENABLE_EGLIMAGE=1",
       "V8_DEPRECATION_WARNINGS",  # Don't use deprecated V8 APIs anywhere.
   ]
 
diff --git a/build/go/rules.gni b/build/go/rules.gni
index 79453d1..ab703d6 100644
--- a/build/go/rules.gni
+++ b/build/go/rules.gni
@@ -53,8 +53,9 @@
       rebase_path("//", root_build_dir),
       "-I" + rebase_path("//"),
       " -L" + rebase_path(target_out_dir) +
+      " -L" + rebase_path(root_build_dir + "/obj/third_party/libevent") +
       " -l" + static_library_name +
-      " -lstdc++ -lpthread -lm -lglib-2.0",
+      " -lstdc++ -lpthread -lm -lglib-2.0 -levent",
       "test", "-c",
     ] + rebase_path(invoker.sources, build_dir)
   }
diff --git a/build/install-build-deps.sh b/build/install-build-deps.sh
index a0f11db..36dd9c4 100755
--- a/build/install-build-deps.sh
+++ b/build/install-build-deps.sh
@@ -105,7 +105,7 @@
           libpulse-dev libsctp-dev libspeechd-dev libsqlite3-dev libssl-dev
           libudev-dev libwww-perl libxslt1-dev libxss-dev libxt-dev libxtst-dev
           mesa-common-dev openbox patch perl php5-cgi pkg-config python
-          python-cherrypy3 python-crypto python-dev python-openssl
+          python-cherrypy3 python-crypto python-dev python-opencv python-openssl
           python-psutil rpm ruby subversion ttf-dejavu-core ttf-indic-fonts
           ttf-kochi-gothic ttf-kochi-mincho wdiff xfonts-mathml zip
           $chromeos_dev_list"
diff --git a/build/isolate.gypi b/build/isolate.gypi
index 17bf3c7..467bdaa 100644
--- a/build/isolate.gypi
+++ b/build/isolate.gypi
@@ -85,6 +85,7 @@
         '--config-variable',
           'internal_gles2_conform_tests=<(internal_gles2_conform_tests)',
         '--config-variable', 'icu_use_data_file_flag=<(icu_use_data_file_flag)',
+        '--config-variable', 'v8_use_external_startup_data=<(v8_use_external_startup_data)',
         '--config-variable', 'lsan=<(lsan)',
         '--config-variable', 'libpeer_target_type=<(libpeer_target_type)',
         '--config-variable', 'use_openssl=<(use_openssl)',
diff --git a/build/slave/OWNERS b/build/slave/OWNERS
index c367f57..f562c92 100644
--- a/build/slave/OWNERS
+++ b/build/slave/OWNERS
@@ -1,15 +1,11 @@
 set noparent
 agable@chromium.org
 agable@google.com
-bevc@chromium.org
-bevc@google.com
 cmp@chromium.org
 cmp@google.com
 dpranke@chromium.org
 iannucci@chromium.org
 iannucci@google.com
-ilevy@chromium.org
-ilevy@google.com
 johnw@chromium.org
 johnw@google.com
 maruel@chromium.org
@@ -18,7 +14,7 @@
 mmoss@google.com
 pschmidt@chromium.org
 pschmidt@google.com
+stip@chromium.org
+stip@google.com
 szager@chromium.org
 szager@google.com
-xusydoc@chromium.org
-xusydoc@google.com
diff --git a/cc/BUILD.gn b/cc/BUILD.gn
index c1df4c9..8cb8e8a 100644
--- a/cc/BUILD.gn
+++ b/cc/BUILD.gn
@@ -320,7 +320,6 @@
     "resources/content_layer_updater.h",
     "resources/eviction_tile_priority_queue.cc",
     "resources/eviction_tile_priority_queue.h",
-    "resources/gpu_memory_buffer_manager.h",
     "resources/gpu_raster_worker_pool.cc",
     "resources/gpu_raster_worker_pool.h",
     "resources/image_layer_updater.cc",
@@ -361,6 +360,7 @@
     "resources/priority_calculator.h",
     "resources/raster_buffer.cc",
     "resources/raster_buffer.h",
+    "resources/raster_source.h",
     "resources/raster_tile_priority_queue.cc",
     "resources/raster_tile_priority_queue.h",
     "resources/raster_worker_pool.cc",
@@ -479,6 +479,7 @@
     "//base/third_party/dynamic_annotations",
     "//gpu",
     "//gpu/command_buffer/client:gles2_interface",
+    "//gpu/command_buffer/client:gpu_memory_buffer_manager",
     "//ui/events:events_base",
     "//ui/gfx",
     "//ui/gfx/geometry",
@@ -626,6 +627,7 @@
     "//base/third_party/dynamic_annotations",
     "//gpu/command_buffer/client:gles2_c_lib",
     "//gpu/command_buffer/client:gles2_implementation",
+    "//gpu/command_buffer/client:gpu_memory_buffer_manager",
     "//gpu/command_buffer/client:gl_in_process_context",
     "//gpu/command_buffer/common:gles2_utils",
     "//gpu/skia_bindings",
diff --git a/cc/DEPS b/cc/DEPS
index 806638f..8bf3649 100644
--- a/cc/DEPS
+++ b/cc/DEPS
@@ -3,6 +3,7 @@
   "+gpu/command_buffer/client/context_support.h",
   "+gpu/command_buffer/client/gles2_interface.h",
   "+gpu/command_buffer/client/gles2_interface_stub.h", # for tests
+  "+gpu/command_buffer/client/gpu_memory_buffer_manager.h",
   "+gpu/command_buffer/common/capabilities.h",
   "+gpu/command_buffer/common/gpu_memory_allocation.h",
   "+gpu/command_buffer/common/mailbox.h",
diff --git a/cc/base/delayed_unique_notifier.h b/cc/base/delayed_unique_notifier.h
index 1f93416..59d906b 100644
--- a/cc/base/delayed_unique_notifier.h
+++ b/cc/base/delayed_unique_notifier.h
@@ -54,6 +54,8 @@
   bool notification_pending_;
 
   base::WeakPtrFactory<DelayedUniqueNotifier> weak_ptr_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(DelayedUniqueNotifier);
 };
 
 }  // namespace cc
diff --git a/cc/base/unique_notifier.h b/cc/base/unique_notifier.h
index 89bfecc..9a4a02c 100644
--- a/cc/base/unique_notifier.h
+++ b/cc/base/unique_notifier.h
@@ -38,6 +38,8 @@
   bool notification_pending_;
 
   base::WeakPtrFactory<UniqueNotifier> weak_ptr_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(UniqueNotifier);
 };
 
 }  // namespace cc
diff --git a/cc/cc.gyp b/cc/cc.gyp
index b5b94bc..3c457f9 100644
--- a/cc/cc.gyp
+++ b/cc/cc.gyp
@@ -355,7 +355,6 @@
         'resources/content_layer_updater.h',
         'resources/eviction_tile_priority_queue.cc',
         'resources/eviction_tile_priority_queue.h',
-        'resources/gpu_memory_buffer_manager.h',
         'resources/gpu_raster_worker_pool.cc',
         'resources/gpu_raster_worker_pool.h',
         'resources/image_layer_updater.cc',
@@ -396,6 +395,7 @@
         'resources/priority_calculator.h',
         'resources/raster_buffer.cc',
         'resources/raster_buffer.h',
+        'resources/raster_source.h',
         'resources/raster_tile_priority_queue.cc',
         'resources/raster_tile_priority_queue.h',
         'resources/raster_worker_pool.cc',
diff --git a/cc/cc_tests.gyp b/cc/cc_tests.gyp
index 94fe444..2724ec0 100644
--- a/cc/cc_tests.gyp
+++ b/cc/cc_tests.gyp
@@ -380,6 +380,7 @@
         '../gpu/gpu.gyp:gles2_c_lib',
         '../gpu/gpu.gyp:gles2_implementation',
         '../gpu/gpu.gyp:gl_in_process_context',
+        '../gpu/gpu.gyp:gpu',
         '../gpu/gpu.gyp:gpu_unittest_utils',
         '../gpu/skia_bindings/skia_bindings.gyp:gpu_skia_bindings',
         '../skia/skia.gyp:skia',
diff --git a/cc/debug/rasterize_and_record_benchmark_impl.cc b/cc/debug/rasterize_and_record_benchmark_impl.cc
index 612dad8..b984655 100644
--- a/cc/debug/rasterize_and_record_benchmark_impl.cc
+++ b/cc/debug/rasterize_and_record_benchmark_impl.cc
@@ -25,11 +25,11 @@
 
 class BenchmarkRasterTask : public Task {
  public:
-  BenchmarkRasterTask(PicturePileImpl* picture_pile,
+  BenchmarkRasterTask(RasterSource* raster_source,
                       const gfx::Rect& content_rect,
                       float contents_scale,
                       size_t repeat_count)
-      : picture_pile_(picture_pile),
+      : raster_source_(raster_source),
         content_rect_(content_rect),
         contents_scale_(contents_scale),
         repeat_count_(repeat_count),
@@ -54,11 +54,11 @@
         bitmap.allocPixels(SkImageInfo::MakeN32Premul(content_rect_.width(),
                                                       content_rect_.height()));
         SkCanvas canvas(bitmap);
-        PicturePileImpl::Analysis analysis;
+        RasterSource::SolidColorAnalysis analysis;
 
-        picture_pile_->AnalyzeInRect(
+        raster_source_->PerformSolidColorAnalysis(
             content_rect_, contents_scale_, &analysis, nullptr);
-        picture_pile_->RasterToBitmap(
+        raster_source_->PlaybackToCanvas(
             &canvas, content_rect_, contents_scale_, nullptr);
 
         is_solid_color_ = analysis.is_solid_color;
@@ -78,7 +78,7 @@
  private:
   ~BenchmarkRasterTask() override {}
 
-  PicturePileImpl* picture_pile_;
+  RasterSource* raster_source_;
   gfx::Rect content_rect_;
   float contents_scale_;
   size_t repeat_count_;
@@ -99,19 +99,21 @@
     return base_client_->CreateTile(tiling, content_rect);
   }
 
-  PicturePileImpl* GetPile() override { return base_client_->GetPile(); }
+  RasterSource* GetRasterSource() override {
+    return base_client_->GetRasterSource();
+  }
 
   gfx::Size CalculateTileSize(const gfx::Size& content_bounds) const override {
     return base_client_->CalculateTileSize(content_bounds);
   }
 
   // This is the only function that returns something different from the base
-  // client.
-  const Region* GetInvalidation() override { return &invalidation_; }
+  // client. Avoids sharing tiles in this area.
+  const Region* GetPendingInvalidation() override { return &invalidation_; }
 
-  const PictureLayerTiling* GetTwinTiling(
+  const PictureLayerTiling* GetPendingOrActiveTwinTiling(
       const PictureLayerTiling* tiling) const override {
-    return base_client_->GetTwinTiling(tiling);
+    return base_client_->GetPendingOrActiveTwinTiling(tiling);
   }
 
   PictureLayerTiling* GetRecycledTwinTiling(
@@ -222,12 +224,12 @@
        ++it) {
     DCHECK(*it);
 
-    PicturePileImpl* picture_pile = (*it)->picture_pile();
+    RasterSource* raster_source = (*it)->raster_source();
     gfx::Rect content_rect = (*it)->content_rect();
     float contents_scale = (*it)->contents_scale();
 
     scoped_refptr<BenchmarkRasterTask> benchmark_raster_task(
-        new BenchmarkRasterTask(picture_pile,
+        new BenchmarkRasterTask(raster_source,
                                 content_rect,
                                 contents_scale,
                                 rasterize_repeat_count_));
diff --git a/cc/layers/picture_image_layer_impl_unittest.cc b/cc/layers/picture_image_layer_impl_unittest.cc
index 6ae23a7..fcaacc7 100644
--- a/cc/layers/picture_image_layer_impl_unittest.cc
+++ b/cc/layers/picture_image_layer_impl_unittest.cc
@@ -10,7 +10,7 @@
 #include "cc/test/fake_impl_proxy.h"
 #include "cc/test/fake_layer_tree_host_impl.h"
 #include "cc/test/fake_output_surface.h"
-#include "cc/test/fake_picture_layer_tiling_client.h"
+#include "cc/test/fake_picture_pile_impl.h"
 #include "cc/test/impl_side_painting_settings.h"
 #include "cc/test/test_shared_bitmap_manager.h"
 #include "cc/trees/layer_tree_impl.h"
@@ -40,7 +40,6 @@
         host_impl_(ImplSidePaintingSettings(),
                    &proxy_,
                    &shared_bitmap_manager_) {
-    tiling_client_.SetTileSize(ImplSidePaintingSettings().default_tile_size);
     host_impl_.CreatePendingTree();
     host_impl_.InitializeRenderer(FakeOutputSurface::Create3d());
   }
@@ -61,10 +60,9 @@
     }
     TestablePictureImageLayerImpl* layer =
         new TestablePictureImageLayerImpl(tree, id);
-    layer->SetBounds(gfx::Size(100, 200));
-    layer->SetContentBounds(gfx::Size(100, 200));
-    layer->tilings_.reset(new PictureLayerTilingSet(&tiling_client_));
-    layer->pile_ = tiling_client_.GetPile();
+    layer->pile_ = FakePicturePileImpl::CreateInfiniteFilledPile();
+    layer->SetBounds(layer->pile_->tiling_size());
+    layer->SetContentBounds(layer->pile_->tiling_size());
     return make_scoped_ptr(layer);
   }
 
@@ -73,7 +71,8 @@
                                          float device_scale_factor,
                                          float page_scale_factor,
                                          float maximum_animation_contents_scale,
-                                         bool animating_transform_to_screen) {
+                                         bool animating_transform_to_screen,
+                                         gfx::Rect viewport_rect) {
     layer->draw_properties().ideal_contents_scale = ideal_contents_scale;
     layer->draw_properties().device_scale_factor = device_scale_factor;
     layer->draw_properties().page_scale_factor = page_scale_factor;
@@ -81,6 +80,7 @@
         maximum_animation_contents_scale;
     layer->draw_properties().screen_space_transform_is_animating =
         animating_transform_to_screen;
+    layer->draw_properties().visible_content_rect = viewport_rect;
     bool resourceless_software_draw = false;
     layer->UpdateTiles(Occlusion(), resourceless_software_draw);
   }
@@ -89,14 +89,16 @@
   FakeImplProxy proxy_;
   FakeLayerTreeHostImpl host_impl_;
   TestSharedBitmapManager shared_bitmap_manager_;
-  FakePictureLayerTilingClient tiling_client_;
 };
 
 TEST_F(PictureImageLayerImplTest, CalculateContentsScale) {
   scoped_ptr<TestablePictureImageLayerImpl> layer(CreateLayer(1, PENDING_TREE));
   layer->SetDrawsContent(true);
+  layer->DoPostCommitInitializationIfNeeded();
 
-  SetupDrawPropertiesAndUpdateTiles(layer.get(), 2.f, 3.f, 4.f, 1.f, false);
+  gfx::Rect viewport(100, 200);
+  SetupDrawPropertiesAndUpdateTiles(
+      layer.get(), 2.f, 3.f, 4.f, 1.f, false, viewport);
 
   EXPECT_FLOAT_EQ(1.f, layer->contents_scale_x());
   EXPECT_FLOAT_EQ(1.f, layer->contents_scale_y());
@@ -108,6 +110,8 @@
       CreateLayer(1, PENDING_TREE));
   pending_layer->SetDrawsContent(true);
 
+  gfx::Rect viewport(100, 200);
+
   // Set PictureLayerImpl::ideal_contents_scale_ to 2.f which is not equal
   // to the content scale used by PictureImageLayerImpl.
   const float suggested_ideal_contents_scale = 2.f;
@@ -120,12 +124,14 @@
                                     device_scale_factor,
                                     page_scale_factor,
                                     maximum_animation_contents_scale,
-                                    animating_transform_to_screen);
+                                    animating_transform_to_screen,
+                                    viewport);
   EXPECT_EQ(1.f, pending_layer->tilings()->tiling_at(0)->contents_scale());
 
   // Push to active layer.
   host_impl_.pending_tree()->SetRootLayer(pending_layer.Pass());
   host_impl_.ActivateSyncTree();
+
   TestablePictureImageLayerImpl* active_layer =
       static_cast<TestablePictureImageLayerImpl*>(
           host_impl_.active_tree()->root_layer());
@@ -134,17 +140,15 @@
                                     device_scale_factor,
                                     page_scale_factor,
                                     maximum_animation_contents_scale,
-                                    animating_transform_to_screen);
+                                    animating_transform_to_screen,
+                                    viewport);
   EXPECT_EQ(1.f, active_layer->tilings()->tiling_at(0)->contents_scale());
 
-  // Create tile and resource.
-  active_layer->tilings()->tiling_at(0)->CreateAllTilesForTesting();
+  // Create resources for the tiles.
   host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(
       active_layer->tilings()->tiling_at(0)->AllTilesForTesting());
 
   // Draw.
-  active_layer->draw_properties().visible_content_rect =
-      gfx::Rect(active_layer->bounds());
   scoped_ptr<RenderPass> render_pass = RenderPass::Create();
   AppendQuadsData data;
   active_layer->WillDraw(DRAW_MODE_SOFTWARE, nullptr);
diff --git a/cc/layers/picture_layer.cc b/cc/layers/picture_layer.cc
index 4d44f00..6e5ba79 100644
--- a/cc/layers/picture_layer.cc
+++ b/cc/layers/picture_layer.cc
@@ -19,7 +19,6 @@
 
 PictureLayer::PictureLayer(ContentLayerClient* client)
     : client_(client),
-      pile_(make_scoped_refptr(new PicturePile())),
       instrumentation_object_tracker_(id()),
       update_source_frame_number_(-1),
       can_use_lcd_text_last_frame_(can_use_lcd_text()) {
@@ -40,29 +39,29 @@
     // Update may not get called for an empty layer, so resize here instead.
     // Using layer_impl because either bounds() or paint_properties().bounds
     // may disagree and either one could have been pushed to layer_impl.
-    pile_->SetEmptyBounds();
+    pile_.SetEmptyBounds();
   } else {
     // If update called, then pile size must match bounds pushed to impl layer.
     DCHECK_IMPLIES(
         update_source_frame_number_ == layer_tree_host()->source_frame_number(),
-        layer_impl->bounds().ToString() == pile_->tiling_size().ToString());
+        layer_impl->bounds().ToString() == pile_.tiling_size().ToString());
   }
 
   // Unlike other properties, invalidation must always be set on layer_impl.
   // See PictureLayerImpl::PushPropertiesTo for more details.
   layer_impl->invalidation_.Clear();
   layer_impl->invalidation_.Swap(&pile_invalidation_);
-  layer_impl->pile_ = PicturePileImpl::CreateFromOther(pile_.get());
+  layer_impl->pile_ = PicturePileImpl::CreateFromOther(&pile_);
 }
 
 void PictureLayer::SetLayerTreeHost(LayerTreeHost* host) {
   Layer::SetLayerTreeHost(host);
   if (host) {
-    pile_->SetMinContentsScale(host->settings().minimum_contents_scale);
-    pile_->SetTileGridSize(host->settings().default_tile_grid_size);
-    pile_->set_slow_down_raster_scale_factor(
+    pile_.SetMinContentsScale(host->settings().minimum_contents_scale);
+    pile_.SetTileGridSize(host->settings().default_tile_grid_size);
+    pile_.set_slow_down_raster_scale_factor(
         host->debug_state().slow_down_raster_scale_factor);
-    pile_->set_show_debug_picture_borders(
+    pile_.set_show_debug_picture_borders(
         host->debug_state().show_picture_borders);
   }
 }
@@ -92,7 +91,7 @@
   gfx::Size layer_size = paint_properties().bounds;
 
   if (last_updated_visible_content_rect_ == visible_content_rect() &&
-      pile_->tiling_size() == layer_size && pending_invalidation_.IsEmpty()) {
+      pile_.tiling_size() == layer_size && pending_invalidation_.IsEmpty()) {
     // Only early out if the visible content rect of this layer hasn't changed.
     return updated;
   }
@@ -120,16 +119,16 @@
   // for them.
   DCHECK(client_);
   updated |=
-      pile_->UpdateAndExpandInvalidation(client_,
-                                         &pile_invalidation_,
-                                         SafeOpaqueBackgroundColor(),
-                                         contents_opaque(),
-                                         client_->FillsBoundsCompletely(),
-                                         layer_size,
-                                         visible_layer_rect,
-                                         update_source_frame_number_,
-                                         Picture::RECORD_NORMALLY,
-                                         rendering_stats_instrumentation());
+      pile_.UpdateAndExpandInvalidation(client_,
+                                        &pile_invalidation_,
+                                        SafeOpaqueBackgroundColor(),
+                                        contents_opaque(),
+                                        client_->FillsBoundsCompletely(),
+                                        layer_size,
+                                        visible_layer_rect,
+                                        update_source_frame_number_,
+                                        Picture::RECORD_NORMALLY,
+                                        rendering_stats_instrumentation());
   last_updated_visible_content_rect_ = visible_content_rect();
 
   if (updated) {
@@ -144,7 +143,7 @@
 }
 
 void PictureLayer::SetIsMask(bool is_mask) {
-  pile_->set_is_mask(is_mask);
+  pile_.set_is_mask(is_mask);
 }
 
 bool PictureLayer::SupportsLCDText() const {
@@ -180,7 +179,7 @@
 }
 
 bool PictureLayer::IsSuitableForGpuRasterization() const {
-  return pile_->is_suitable_for_gpu_rasterization();
+  return pile_.is_suitable_for_gpu_rasterization();
 }
 
 void PictureLayer::ClearClient() {
diff --git a/cc/layers/picture_layer.h b/cc/layers/picture_layer.h
index 0ba26e6..232dba2 100644
--- a/cc/layers/picture_layer.h
+++ b/cc/layers/picture_layer.h
@@ -39,7 +39,7 @@
 
   ContentLayerClient* client() { return client_; }
 
-  PicturePile* GetPicturePileForTesting() const { return pile_.get(); }
+  PicturePile* GetPicturePileForTesting() { return &pile_; }
 
  protected:
   explicit PictureLayer(ContentLayerClient* client);
@@ -50,7 +50,7 @@
 
  private:
   ContentLayerClient* client_;
-  scoped_refptr<PicturePile> pile_;
+  PicturePile pile_;
   devtools_instrumentation::
       ScopedLayerObjectTracker instrumentation_object_tracker_;
   // Invalidation to use the next time update is called.
diff --git a/cc/layers/picture_layer_impl.cc b/cc/layers/picture_layer_impl.cc
index e51821f..7fd7730 100644
--- a/cc/layers/picture_layer_impl.cc
+++ b/cc/layers/picture_layer_impl.cc
@@ -90,6 +90,8 @@
 }
 
 PictureLayerImpl::~PictureLayerImpl() {
+  if (twin_layer_)
+    twin_layer_->twin_layer_ = nullptr;
   layer_tree_impl()->UnregisterPictureLayerImpl(this);
 }
 
@@ -110,10 +112,15 @@
 
   LayerImpl::PushPropertiesTo(base_layer);
 
-  // When the pending tree pushes to the active tree, the pending twin
-  // becomes recycled.
-  layer_impl->twin_layer_ = nullptr;
-  twin_layer_ = nullptr;
+  // Twin relationships should never change once established.
+  DCHECK_IMPLIES(twin_layer_, twin_layer_ == layer_impl);
+  DCHECK_IMPLIES(twin_layer_, layer_impl->twin_layer_ == this);
+  // The twin relationship does not need to exist before the first
+  // PushPropertiesTo from pending to active layer since before that the active
+  // layer can not have a pile or tilings, it has only been created and inserted
+  // into the tree at that point.
+  twin_layer_ = layer_impl;
+  layer_impl->twin_layer_ = this;
 
   layer_impl->pile_ = pile_;
 
@@ -155,6 +162,11 @@
                                    const Occlusion& occlusion_in_content_space,
                                    AppendQuadsData* append_quads_data) {
   DCHECK(!needs_post_commit_initialization_);
+  // The bounds and the pile size may differ if the pile wasn't updated (ie.
+  // PictureLayer::Update didn't happen). But that should never be the case if
+  // the layer is part of the visible frame, which is why we're appending quads
+  // in the first place
+  DCHECK_EQ(bounds().ToString(), pile_->tiling_size().ToString());
 
   SharedQuadState* shared_quad_state =
       render_pass->CreateAndAppendSharedQuadState();
@@ -163,7 +175,7 @@
     PopulateSharedQuadState(shared_quad_state);
 
     AppendDebugBorderQuad(
-        render_pass, content_bounds(), shared_quad_state, append_quads_data);
+        render_pass, bounds(), shared_quad_state, append_quads_data);
 
     SolidColorLayerImpl::AppendSolidQuads(render_pass,
                                           occlusion_in_content_space,
@@ -179,7 +191,7 @@
   scaled_draw_transform.Scale(SK_MScalar1 / max_contents_scale,
                               SK_MScalar1 / max_contents_scale);
   gfx::Size scaled_content_bounds =
-      gfx::ToCeiledSize(gfx::ScaleSize(content_bounds(), max_contents_scale));
+      gfx::ToCeiledSize(gfx::ScaleSize(bounds(), max_contents_scale));
   gfx::Rect scaled_visible_content_rect =
       gfx::ScaleToEnclosingRect(visible_content_rect(), max_contents_scale);
   scaled_visible_content_rect.Intersect(gfx::Rect(scaled_content_bounds));
@@ -561,10 +573,16 @@
   return visible_rect_in_content_space;
 }
 
-PictureLayerImpl* PictureLayerImpl::GetRecycledTwinLayer() {
-  // TODO(vmpstr): Maintain recycled twin as a member. crbug.com/407418
-  return static_cast<PictureLayerImpl*>(
-      layer_tree_impl()->FindRecycleTreeLayerById(id()));
+PictureLayerImpl* PictureLayerImpl::GetPendingOrActiveTwinLayer() const {
+  if (!twin_layer_ || !twin_layer_->IsOnActiveOrPendingTree())
+    return nullptr;
+  return twin_layer_;
+}
+
+PictureLayerImpl* PictureLayerImpl::GetRecycledTwinLayer() const {
+  if (!twin_layer_ || twin_layer_->IsOnActiveOrPendingTree())
+    return nullptr;
+  return twin_layer_;
 }
 
 void PictureLayerImpl::NotifyTileStateChanged(const Tile* tile) {
@@ -628,19 +646,28 @@
       flags);
 }
 
-PicturePileImpl* PictureLayerImpl::GetPile() {
+RasterSource* PictureLayerImpl::GetRasterSource() {
   return pile_.get();
 }
 
-const Region* PictureLayerImpl::GetInvalidation() {
-  return &invalidation_;
+const Region* PictureLayerImpl::GetPendingInvalidation() {
+  if (layer_tree_impl()->IsPendingTree())
+    return &invalidation_;
+  DCHECK(layer_tree_impl()->IsActiveTree());
+  if (PictureLayerImpl* twin_layer = GetPendingOrActiveTwinLayer())
+    return &twin_layer->invalidation_;
+  return nullptr;
 }
 
-const PictureLayerTiling* PictureLayerImpl::GetTwinTiling(
+const PictureLayerTiling* PictureLayerImpl::GetPendingOrActiveTwinTiling(
     const PictureLayerTiling* tiling) const {
-  if (!twin_layer_)
+  PictureLayerImpl* twin_layer = GetPendingOrActiveTwinLayer();
+  if (!twin_layer)
     return nullptr;
-  return twin_layer_->tilings_->TilingAtScale(tiling->contents_scale());
+  // TODO(danakj): Remove this when no longer swapping tilings.
+  if (!twin_layer->tilings_)
+    return nullptr;
+  return twin_layer->tilings_->TilingAtScale(tiling->contents_scale());
 }
 
 PictureLayerTiling* PictureLayerImpl::GetRecycledTwinTiling(
@@ -770,8 +797,10 @@
 
   bool synced_high_res_tiling = false;
   if (CanHaveTilings()) {
-    synced_high_res_tiling = tilings_->SyncTilings(
-        *other->tilings_, bounds(), invalidation_, MinimumContentsScale());
+    synced_high_res_tiling = tilings_->SyncTilings(*other->tilings_,
+                                                   pile_->tiling_size(),
+                                                   invalidation_,
+                                                   MinimumContentsScale());
   } else {
     RemoveAllTilings();
   }
@@ -791,9 +820,11 @@
 
 void PictureLayerImpl::SyncTiling(
     const PictureLayerTiling* tiling) {
+  if (!tilings_)
+    return;
   if (!CanHaveTilingWithScale(tiling->contents_scale()))
     return;
-  tilings_->AddTiling(tiling->contents_scale(), bounds());
+  tilings_->AddTiling(tiling->contents_scale(), pile_->tiling_size());
 
   // If this tree needs update draw properties, then the tiling will
   // get updated prior to drawing or activation.  If this tree does not
@@ -812,6 +843,7 @@
 void PictureLayerImpl::GetContentsResourceId(
     ResourceProvider::ResourceId* resource_id,
     gfx::Size* resource_size) const {
+  DCHECK_EQ(bounds().ToString(), pile_->tiling_size().ToString());
   gfx::Rect content_rect(bounds());
   PictureLayerTilingSet::CoverageIterator iter(
       tilings_.get(), 1.f, content_rect, ideal_contents_scale_);
@@ -845,16 +877,12 @@
   if (!tilings_)
     tilings_ = make_scoped_ptr(new PictureLayerTilingSet(this));
 
-  DCHECK(!twin_layer_);
-  twin_layer_ = static_cast<PictureLayerImpl*>(
-      layer_tree_impl()->FindActiveTreeLayerById(id()));
-  if (twin_layer_) {
-    DCHECK(!twin_layer_->twin_layer_);
-    twin_layer_->twin_layer_ = this;
+  PictureLayerImpl* twin_layer = GetPendingOrActiveTwinLayer();
+  if (twin_layer) {
     // If the twin has never been pushed to, do not sync from it.
     // This can happen if this function is called during activation.
-    if (!twin_layer_->needs_post_commit_initialization_)
-      SyncFromActiveLayer(twin_layer_);
+    if (!twin_layer->needs_post_commit_initialization_)
+      SyncFromActiveLayer(twin_layer);
   }
 
   needs_post_commit_initialization_ = false;
@@ -864,12 +892,13 @@
   DCHECK(CanHaveTilingWithScale(contents_scale)) <<
       "contents_scale: " << contents_scale;
 
-  PictureLayerTiling* tiling = tilings_->AddTiling(contents_scale, bounds());
+  PictureLayerTiling* tiling =
+      tilings_->AddTiling(contents_scale, pile_->tiling_size());
 
   DCHECK(pile_->HasRecordings());
 
-  if (twin_layer_)
-    twin_layer_->SyncTiling(tiling);
+  if (PictureLayerImpl* twin_layer = GetPendingOrActiveTwinLayer())
+    twin_layer->SyncTiling(tiling);
 
   return tiling;
 }
@@ -1067,8 +1096,8 @@
     // See crbug.com/422341.
     float maximum_scale = draw_properties().maximum_animation_contents_scale;
     if (maximum_scale) {
-      gfx::Size bounds_at_maximum_scale =
-          gfx::ToCeiledSize(gfx::ScaleSize(bounds(), maximum_scale));
+      gfx::Size bounds_at_maximum_scale = gfx::ToCeiledSize(
+          gfx::ScaleSize(pile_->tiling_size(), maximum_scale));
       if (bounds_at_maximum_scale.GetArea() <=
           layer_tree_impl()->device_viewport_size().GetArea())
         can_raster_at_maximum_scale = true;
@@ -1084,11 +1113,11 @@
 
   // If this layer would create zero or one tiles at this content scale,
   // don't create a low res tiling.
-  gfx::Size content_bounds =
-      gfx::ToCeiledSize(gfx::ScaleSize(bounds(), raster_contents_scale_));
-  gfx::Size tile_size = CalculateTileSize(content_bounds);
-  bool tile_covers_bounds = tile_size.width() >= content_bounds.width() &&
-                            tile_size.height() >= content_bounds.height();
+  gfx::Size raster_bounds = gfx::ToCeiledSize(
+      gfx::ScaleSize(pile_->tiling_size(), raster_contents_scale_));
+  gfx::Size tile_size = CalculateTileSize(raster_bounds);
+  bool tile_covers_bounds = tile_size.width() >= raster_bounds.width() &&
+                            tile_size.height() >= raster_bounds.height();
   if (tile_size.IsEmpty() || tile_covers_bounds) {
     low_res_raster_contents_scale_ = raster_contents_scale_;
     return;
@@ -1113,7 +1142,7 @@
       raster_contents_scale_, ideal_contents_scale_);
   float twin_low_res_scale = 0.f;
 
-  PictureLayerImpl* twin = twin_layer_;
+  PictureLayerImpl* twin = GetPendingOrActiveTwinLayer();
   if (twin && twin->CanHaveTilings()) {
     min_acceptable_high_res_scale = std::min(
         min_acceptable_high_res_scale,
@@ -1122,10 +1151,14 @@
         max_acceptable_high_res_scale,
         std::max(twin->raster_contents_scale_, twin->ideal_contents_scale_));
 
-    for (size_t i = 0; i < twin->tilings_->num_tilings(); ++i) {
-      PictureLayerTiling* tiling = twin->tilings_->tiling_at(i);
-      if (tiling->resolution() == LOW_RESOLUTION)
-        twin_low_res_scale = tiling->contents_scale();
+    // TODO(danakj): Remove the tilings_ check when we create them in the
+    // constructor.
+    if (twin->tilings_) {
+      for (size_t i = 0; i < twin->tilings_->num_tilings(); ++i) {
+        PictureLayerTiling* tiling = twin->tilings_->tiling_at(i);
+        if (tiling->resolution() == LOW_RESOLUTION)
+          twin_low_res_scale = tiling->contents_scale();
+      }
     }
   }
 
@@ -1160,7 +1193,8 @@
   PictureLayerImpl* recycled_twin = GetRecycledTwinLayer();
   // Remove tilings on this tree and the twin tree.
   for (size_t i = 0; i < to_remove.size(); ++i) {
-    const PictureLayerTiling* twin_tiling = GetTwinTiling(to_remove[i]);
+    const PictureLayerTiling* twin_tiling =
+        GetPendingOrActiveTwinTiling(to_remove[i]);
     // Only remove tilings from the twin layer if they have
     // NON_IDEAL_RESOLUTION.
     if (twin_tiling && twin_tiling->resolution() == NON_IDEAL_RESOLUTION)
@@ -1185,7 +1219,8 @@
   // then it will end up having less than one pixel of content in that
   // dimension.  Bump the minimum contents scale up in this case to prevent
   // this from happening.
-  int min_dimension = std::min(bounds().width(), bounds().height());
+  int min_dimension =
+      std::min(pile_->tiling_size().width(), pile_->tiling_size().height());
   if (!min_dimension)
     return setting_min;
 
@@ -1318,10 +1353,11 @@
   state->EndArray();
 
   state->BeginArray("coverage_tiles");
-  for (PictureLayerTilingSet::CoverageIterator iter(tilings_.get(),
-                                                    1.f,
-                                                    gfx::Rect(content_bounds()),
-                                                    ideal_contents_scale_);
+  for (PictureLayerTilingSet::CoverageIterator iter(
+           tilings_.get(),
+           1.f,
+           gfx::Rect(pile_->tiling_size()),
+           ideal_contents_scale_);
        iter;
        ++iter) {
     state->BeginDictionary();
diff --git a/cc/layers/picture_layer_impl.h b/cc/layers/picture_layer_impl.h
index 1ac106a..c5aab85 100644
--- a/cc/layers/picture_layer_impl.h
+++ b/cc/layers/picture_layer_impl.h
@@ -119,10 +119,10 @@
   // PictureLayerTilingClient overrides.
   scoped_refptr<Tile> CreateTile(PictureLayerTiling* tiling,
                                  const gfx::Rect& content_rect) override;
-  PicturePileImpl* GetPile() override;
+  RasterSource* GetRasterSource() override;
   gfx::Size CalculateTileSize(const gfx::Size& content_bounds) const override;
-  const Region* GetInvalidation() override;
-  const PictureLayerTiling* GetTwinTiling(
+  const Region* GetPendingInvalidation() override;
+  const PictureLayerTiling* GetPendingOrActiveTwinTiling(
       const PictureLayerTiling* tiling) const override;
   PictureLayerTiling* GetRecycledTwinTiling(
       const PictureLayerTiling* tiling) override;
@@ -144,7 +144,7 @@
   void RunMicroBenchmark(MicroBenchmarkImpl* benchmark) override;
 
   // Functions used by tile manager.
-  PictureLayerImpl* GetTwinLayer() { return twin_layer_; }
+  PictureLayerImpl* GetPendingOrActiveTwinLayer() const;
   bool IsOnActiveOrPendingTree() const;
   // Virtual for testing.
   virtual bool HasValidTilePriorities() const;
@@ -168,7 +168,7 @@
   float SnappedContentsScale(float new_contents_scale);
   void ResetRasterScale();
   gfx::Rect GetViewportForTilePriorityInContentSpace() const;
-  PictureLayerImpl* GetRecycledTwinLayer();
+  PictureLayerImpl* GetRecycledTwinLayer() const;
 
   void DoPostCommitInitializationIfNeeded() {
     if (needs_post_commit_initialization_)
diff --git a/cc/layers/picture_layer_impl_unittest.cc b/cc/layers/picture_layer_impl_unittest.cc
index 3920779..06f75f0 100644
--- a/cc/layers/picture_layer_impl_unittest.cc
+++ b/cc/layers/picture_layer_impl_unittest.cc
@@ -138,12 +138,23 @@
     host_impl_.CreatePendingTree();
     host_impl_.pending_tree()->SetPageScaleFactorAndLimits(1.f, 0.25f, 100.f);
     LayerTreeImpl* pending_tree = host_impl_.pending_tree();
-    // Clear recycled tree.
-    pending_tree->DetachLayerTree();
 
-    scoped_ptr<FakePictureLayerImpl> pending_layer =
-        FakePictureLayerImpl::CreateWithPile(pending_tree, id_, pile);
-    pending_layer->SetDrawsContent(true);
+    // Steal from the recycled tree.
+    scoped_ptr<LayerImpl> old_pending_root = pending_tree->DetachLayerTree();
+    DCHECK_IMPLIES(old_pending_root, old_pending_root->id() == id_);
+
+    scoped_ptr<FakePictureLayerImpl> pending_layer;
+    if (old_pending_root) {
+      pending_layer.reset(
+          static_cast<FakePictureLayerImpl*>(old_pending_root.release()));
+      pending_layer->SetPile(pile);
+    } else {
+      pending_layer =
+          FakePictureLayerImpl::CreateWithPile(pending_tree, id_, pile);
+      pending_layer->SetDrawsContent(true);
+    }
+    // The bounds() just mirror the pile size.
+    pending_layer->SetBounds(pending_layer->pile()->tiling_size());
     pending_tree->SetRootLayer(pending_layer.Pass());
 
     pending_layer_ = static_cast<FakePictureLayerImpl*>(
@@ -177,7 +188,7 @@
          iter;
          ++iter) {
       EXPECT_TRUE(*iter);
-      EXPECT_EQ(pile, iter->picture_pile());
+      EXPECT_EQ(pile, iter->raster_source());
     }
   }
 
@@ -529,9 +540,9 @@
       EXPECT_TRUE(*iter);
       EXPECT_FALSE(iter.geometry_rect().IsEmpty());
       if (iter.geometry_rect().Intersects(content_invalidation))
-        EXPECT_EQ(pending_pile.get(), iter->picture_pile());
+        EXPECT_EQ(pending_pile.get(), iter->raster_source());
       else
-        EXPECT_EQ(active_pile.get(), iter->picture_pile());
+        EXPECT_EQ(active_pile.get(), iter->raster_source());
     }
   }
 }
@@ -598,9 +609,9 @@
           iter.geometry_rect().bottom() >= active_content_bounds.height() ||
           active_tiles[0]->content_rect().size() !=
               pending_tiles[0]->content_rect().size()) {
-        EXPECT_EQ(pending_pile.get(), iter->picture_pile());
+        EXPECT_EQ(pending_pile.get(), iter->raster_source());
       } else {
-        EXPECT_EQ(active_pile.get(), iter->picture_pile());
+        EXPECT_EQ(active_pile.get(), iter->raster_source());
       }
     }
   }
@@ -653,9 +664,9 @@
                                               iter.full_tile_geometry_rect());
 
       if (in_pending && !in_active)
-        EXPECT_EQ(pending_pile.get(), iter->picture_pile());
+        EXPECT_EQ(pending_pile.get(), iter->raster_source());
       else if (in_active)
-        EXPECT_EQ(active_pile.get(), iter->picture_pile());
+        EXPECT_EQ(active_pile.get(), iter->raster_source());
       else
         EXPECT_FALSE(*iter);
     }
@@ -1436,7 +1447,7 @@
 
   gfx::Size tile_size(1000, 1000);
   gfx::Size layer_bounds(1500, 1500);
-  gfx::Rect visible_rect(1000, 1000);
+  gfx::Rect visible_rect(250, 250, 1000, 1000);
 
   scoped_refptr<FakePicturePileImpl> pending_pile =
       FakePicturePileImpl::CreateEmptyPile(tile_size, layer_bounds);
@@ -2026,6 +2037,62 @@
   EXPECT_FALSE(active_layer_->needs_post_commit_initialization());
 }
 
+TEST_F(PictureLayerImplTest, ShareTilesOnNextFrame) {
+  SetupDefaultTrees(gfx::Size(1500, 1500));
+
+  PictureLayerTiling* tiling = pending_layer_->AddTiling(1.f);
+  gfx::Rect first_invalidate = tiling->TilingDataForTesting().TileBounds(0, 0);
+  first_invalidate.Inset(tiling->TilingDataForTesting().border_texels(),
+                         tiling->TilingDataForTesting().border_texels());
+  gfx::Rect second_invalidate = tiling->TilingDataForTesting().TileBounds(1, 1);
+  second_invalidate.Inset(tiling->TilingDataForTesting().border_texels(),
+                          tiling->TilingDataForTesting().border_texels());
+
+  // Make a pending tree with an invalidated raster tile 0,0.
+  tiling->CreateAllTilesForTesting();
+  pending_layer_->set_invalidation(first_invalidate);
+
+  // Activate and make a pending tree with an invalidated raster tile 1,1.
+  ActivateTree();
+
+  host_impl_.CreatePendingTree();
+  pending_layer_ = static_cast<FakePictureLayerImpl*>(
+      host_impl_.pending_tree()->root_layer());
+  pending_layer_->set_invalidation(second_invalidate);
+
+  PictureLayerTiling* pending_tiling = pending_layer_->tilings()->tiling_at(0);
+  PictureLayerTiling* active_tiling = active_layer_->tilings()->tiling_at(0);
+
+  pending_tiling->CreateAllTilesForTesting();
+
+  // Tile 0,0 should be shared, but tile 1,1 should not be.
+  EXPECT_EQ(active_tiling->TileAt(0, 0), pending_tiling->TileAt(0, 0));
+  EXPECT_EQ(active_tiling->TileAt(1, 0), pending_tiling->TileAt(1, 0));
+  EXPECT_EQ(active_tiling->TileAt(0, 1), pending_tiling->TileAt(0, 1));
+  EXPECT_NE(active_tiling->TileAt(1, 1), pending_tiling->TileAt(1, 1));
+  EXPECT_TRUE(pending_tiling->TileAt(0, 0)->is_shared());
+  EXPECT_TRUE(pending_tiling->TileAt(1, 0)->is_shared());
+  EXPECT_TRUE(pending_tiling->TileAt(0, 1)->is_shared());
+  EXPECT_FALSE(pending_tiling->TileAt(1, 1)->is_shared());
+
+  // Drop the tiles on the active tree and recreate them. The same tiles
+  // should be shared or not.
+  active_tiling->ComputeTilePriorityRects(
+      ACTIVE_TREE, gfx::Rect(), 1.f, 1.0, Occlusion());
+  EXPECT_TRUE(active_tiling->AllTilesForTesting().empty());
+  active_tiling->CreateAllTilesForTesting();
+
+  // Tile 0,0 should be shared, but tile 1,1 should not be.
+  EXPECT_EQ(active_tiling->TileAt(0, 0), pending_tiling->TileAt(0, 0));
+  EXPECT_EQ(active_tiling->TileAt(1, 0), pending_tiling->TileAt(1, 0));
+  EXPECT_EQ(active_tiling->TileAt(0, 1), pending_tiling->TileAt(0, 1));
+  EXPECT_NE(active_tiling->TileAt(1, 1), pending_tiling->TileAt(1, 1));
+  EXPECT_TRUE(pending_tiling->TileAt(0, 0)->is_shared());
+  EXPECT_TRUE(pending_tiling->TileAt(1, 0)->is_shared());
+  EXPECT_TRUE(pending_tiling->TileAt(0, 1)->is_shared());
+  EXPECT_FALSE(pending_tiling->TileAt(1, 1)->is_shared());
+}
+
 TEST_F(PictureLayerImplTest, ShareTilesOnSync) {
   SetupDefaultTrees(gfx::Size(1500, 1500));
   AddDefaultTilingsWithInvalidation(gfx::Rect());
@@ -2222,13 +2289,17 @@
 }
 
 TEST_F(PictureLayerImplTest, HighResCreatedWhenBoundsShrink) {
-  SetupDefaultTrees(gfx::Size(10, 10));
+  gfx::Size tile_size(100, 100);
+
+  scoped_refptr<FakePicturePileImpl> active_pile =
+      FakePicturePileImpl::CreateFilledPile(tile_size, gfx::Size(10, 10));
+  SetupPendingTree(active_pile);
+  ActivateTree();
   host_impl_.active_tree()->UpdateDrawProperties();
   EXPECT_FALSE(host_impl_.active_tree()->needs_update_draw_properties());
 
   SetupDrawPropertiesAndUpdateTiles(
       active_layer_, 0.5f, 0.5f, 0.5f, 0.5f, false);
-  pending_layer_->tilings()->RemoveAllTilings();
   active_layer_->tilings()->RemoveAllTilings();
   PictureLayerTiling* tiling = active_layer_->AddTiling(0.5f);
   active_layer_->AddTiling(1.5f);
@@ -2239,21 +2310,17 @@
   ASSERT_EQ(3u, active_layer_->tilings()->num_tilings());
   ASSERT_EQ(tiling, active_layer_->tilings()->TilingAtScale(0.5f));
 
-  pending_layer_->tilings()->RemoveAllTilings();
-  ASSERT_EQ(0u, pending_layer_->tilings()->num_tilings());
-
   // Now, set the bounds to be 1x1 (so that minimum contents scale becomes
   // 1.0f). Note that we should also ensure that the pending layer needs post
   // commit initialization, since this is what would happen during commit. In
   // other words we want the pending layer to sync from the active layer.
-  pending_layer_->SetBounds(gfx::Size(1, 1));
-  pending_layer_->SetNeedsPostCommitInitialization();
-  pending_layer_->set_twin_layer(nullptr);
-  active_layer_->set_twin_layer(nullptr);
-  EXPECT_TRUE(pending_layer_->needs_post_commit_initialization());
+  scoped_refptr<FakePicturePileImpl> pending_pile =
+      FakePicturePileImpl::CreateFilledPile(tile_size, gfx::Size(1, 1));
+  SetupPendingTree(pending_pile);
 
   // Update the draw properties: sync from active tree should happen here.
   host_impl_.pending_tree()->UpdateDrawProperties();
+  EXPECT_FALSE(pending_layer_->needs_post_commit_initialization());
 
   // Another sanity check.
   ASSERT_EQ(1.f, pending_layer_->MinimumContentsScale());
@@ -2636,45 +2703,6 @@
                                maximum_animation_scale,
                                animating_transform);
   EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 4.f);
-
-  static_cast<FakePicturePileImpl*>(pending_layer_->pile())->set_has_text(true);
-  static_cast<FakePicturePileImpl*>(active_layer_->pile())->set_has_text(true);
-
-  // When we're GPU-rasterizing, even if we have text, starting an animation
-  // should cause tiling resolution to get set to the content scale, since we
-  // render animating text at content scale using distance fields.
-  animating_transform = true;
-  contents_scale = 2.f;
-  maximum_animation_scale = 3.f;
-
-  SetContentsScaleOnBothLayers(contents_scale,
-                               device_scale,
-                               page_scale,
-                               maximum_animation_scale,
-                               animating_transform);
-  EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 2.f);
-
-  // Further changes to scale during the animation should still cause a new
-  // high-res tiling to get created at content scale.
-  contents_scale = 4.f;
-  maximum_animation_scale = 5.f;
-
-  SetContentsScaleOnBothLayers(contents_scale,
-                               device_scale,
-                               page_scale,
-                               maximum_animation_scale,
-                               animating_transform);
-  EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 4.f);
-
-  // Once we stop animating, a new high-res tiling should be created.
-  animating_transform = false;
-
-  SetContentsScaleOnBothLayers(contents_scale,
-                               device_scale,
-                               page_scale,
-                               maximum_animation_scale,
-                               animating_transform);
-  EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 4.f);
 }
 
 TEST_F(PictureLayerImplTest, LayerRasterTileIterator) {
@@ -4143,8 +4171,8 @@
       // All tiles are unoccluded on the pending tree.
       EXPECT_FALSE(tile->is_occluded(PENDING_TREE));
 
-      Tile* twin_tile =
-          pending_layer_->GetTwinTiling(tiling)->TileAt(iter.i(), iter.j());
+      Tile* twin_tile = pending_layer_->GetPendingOrActiveTwinTiling(tiling)
+                            ->TileAt(iter.i(), iter.j());
       gfx::Rect scaled_content_rect = ScaleToEnclosingRect(
           tile->content_rect(), 1.0f / tile->contents_scale());
 
@@ -4178,8 +4206,8 @@
         continue;
       const Tile* tile = *iter;
 
-      Tile* twin_tile =
-          active_layer_->GetTwinTiling(tiling)->TileAt(iter.i(), iter.j());
+      Tile* twin_tile = active_layer_->GetPendingOrActiveTwinTiling(tiling)
+                            ->TileAt(iter.i(), iter.j());
       gfx::Rect scaled_content_rect = ScaleToEnclosingRect(
           tile->content_rect(), 1.0f / tile->contents_scale());
 
@@ -4356,6 +4384,33 @@
                                    total_expected_occluded_tile_count);
 }
 
+TEST_F(PictureLayerImplTest, PendingOrActiveTwinLayer) {
+  gfx::Size tile_size(102, 102);
+  gfx::Size layer_bounds(1000, 1000);
+
+  scoped_refptr<FakePicturePileImpl> pile =
+      FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
+  SetupPendingTree(pile);
+  EXPECT_FALSE(pending_layer_->GetPendingOrActiveTwinLayer());
+
+  ActivateTree();
+  EXPECT_FALSE(active_layer_->GetPendingOrActiveTwinLayer());
+
+  SetupPendingTree(pile);
+  EXPECT_TRUE(pending_layer_->GetPendingOrActiveTwinLayer());
+  EXPECT_TRUE(active_layer_->GetPendingOrActiveTwinLayer());
+  EXPECT_EQ(pending_layer_, active_layer_->GetPendingOrActiveTwinLayer());
+  EXPECT_EQ(active_layer_, pending_layer_->GetPendingOrActiveTwinLayer());
+
+  ActivateTree();
+  EXPECT_FALSE(active_layer_->GetPendingOrActiveTwinLayer());
+
+  // Make an empty pending tree.
+  host_impl_.CreatePendingTree();
+  host_impl_.pending_tree()->DetachLayerTree();
+  EXPECT_FALSE(active_layer_->GetPendingOrActiveTwinLayer());
+}
+
 TEST_F(PictureLayerImplTest, RecycledTwinLayer) {
   gfx::Size tile_size(102, 102);
   gfx::Size layer_bounds(1000, 1000);
@@ -4377,7 +4432,9 @@
   EXPECT_TRUE(active_layer_->GetRecycledTwinLayer());
   EXPECT_EQ(old_pending_layer_, active_layer_->GetRecycledTwinLayer());
 
-  host_impl_.ResetRecycleTreeForTesting();
+  // Make an empty pending tree.
+  host_impl_.CreatePendingTree();
+  host_impl_.pending_tree()->DetachLayerTree();
   EXPECT_FALSE(active_layer_->GetRecycledTwinLayer());
 }
 
diff --git a/cc/layers/solid_color_layer_impl.cc b/cc/layers/solid_color_layer_impl.cc
index e7ba09f..3376693 100644
--- a/cc/layers/solid_color_layer_impl.cc
+++ b/cc/layers/solid_color_layer_impl.cc
@@ -36,16 +36,16 @@
     AppendQuadsData* append_quads_data) {
   // We create a series of smaller quads instead of just one large one so that
   // the culler can reduce the total pixels drawn.
-  int width = visible_content_rect.width();
-  int height = visible_content_rect.height();
+  int right = visible_content_rect.right();
+  int bottom = visible_content_rect.bottom();
   for (int x = visible_content_rect.x(); x < visible_content_rect.right();
        x += kSolidQuadTileSize) {
     for (int y = visible_content_rect.y(); y < visible_content_rect.bottom();
          y += kSolidQuadTileSize) {
       gfx::Rect quad_rect(x,
                           y,
-                          std::min(width - x, kSolidQuadTileSize),
-                          std::min(height - y, kSolidQuadTileSize));
+                          std::min(right - x, kSolidQuadTileSize),
+                          std::min(bottom - y, kSolidQuadTileSize));
       gfx::Rect visible_quad_rect =
           occlusion_in_content_space.GetUnoccludedContentRect(quad_rect);
       if (visible_quad_rect.IsEmpty())
diff --git a/cc/output/direct_renderer.cc b/cc/output/direct_renderer.cc
index ad39f1a..ead2e21 100644
--- a/cc/output/direct_renderer.cc
+++ b/cc/output/direct_renderer.cc
@@ -82,12 +82,11 @@
                                         const gfx::Rect& draw_rect,
                                         const gfx::Rect& viewport_rect,
                                         const gfx::Size& surface_size) {
-  bool flip_y = FlippedFramebuffer();
-
   DCHECK_GE(viewport_rect.x(), 0);
   DCHECK_GE(viewport_rect.y(), 0);
   DCHECK_LE(viewport_rect.right(), surface_size.width());
   DCHECK_LE(viewport_rect.bottom(), surface_size.height());
+  bool flip_y = FlippedFramebuffer(frame);
   if (flip_y) {
     frame->projection_matrix = OrthoProjectionMatrix(draw_rect.x(),
                                                      draw_rect.right(),
@@ -115,11 +114,12 @@
 }
 
 gfx::Rect DirectRenderer::MoveFromDrawToWindowSpace(
+    const DrawingFrame* frame,
     const gfx::Rect& draw_rect) const {
   gfx::Rect window_rect = draw_rect;
   window_rect -= current_draw_rect_.OffsetFromOrigin();
   window_rect += current_viewport_rect_.OffsetFromOrigin();
-  if (FlippedFramebuffer())
+  if (FlippedFramebuffer(frame))
     window_rect.set_y(current_surface_size_.height() - window_rect.bottom());
   return window_rect;
 }
@@ -279,7 +279,7 @@
 gfx::Rect DirectRenderer::DeviceClipRectInWindowSpace(const DrawingFrame* frame)
     const {
   gfx::Rect device_clip_rect = frame->device_clip_rect;
-  if (FlippedFramebuffer())
+  if (FlippedFramebuffer(frame))
     device_clip_rect.set_y(current_surface_size_.height() -
                            device_clip_rect.bottom());
   return device_clip_rect;
@@ -321,7 +321,8 @@
 void DirectRenderer::SetScissorTestRectInDrawSpace(
     const DrawingFrame* frame,
     const gfx::Rect& draw_space_rect) {
-  gfx::Rect window_space_rect = MoveFromDrawToWindowSpace(draw_space_rect);
+  gfx::Rect window_space_rect =
+      MoveFromDrawToWindowSpace(frame, draw_space_rect);
   if (NeedDeviceClip(frame))
     window_space_rect.Intersect(DeviceClipRectInWindowSpace(frame));
   SetScissorTestRect(window_space_rect);
diff --git a/cc/output/direct_renderer.h b/cc/output/direct_renderer.h
index 4966e63..40fff83 100644
--- a/cc/output/direct_renderer.h
+++ b/cc/output/direct_renderer.h
@@ -71,7 +71,8 @@
                           const gfx::Rect& draw_rect,
                           const gfx::Rect& viewport_rect,
                           const gfx::Size& surface_size);
-  gfx::Rect MoveFromDrawToWindowSpace(const gfx::Rect& draw_rect) const;
+  gfx::Rect MoveFromDrawToWindowSpace(const DrawingFrame* frame,
+                                      const gfx::Rect& draw_rect) const;
 
   bool NeedDeviceClip(const DrawingFrame* frame) const;
   gfx::Rect DeviceClipRectInWindowSpace(const DrawingFrame* frame) const;
@@ -104,7 +105,7 @@
   virtual void BeginDrawingFrame(DrawingFrame* frame) = 0;
   virtual void FinishDrawingFrame(DrawingFrame* frame) = 0;
   virtual void FinishDrawingQuadList();
-  virtual bool FlippedFramebuffer() const = 0;
+  virtual bool FlippedFramebuffer(const DrawingFrame* frame) const = 0;
   virtual void EnsureScissorTestEnabled() = 0;
   virtual void EnsureScissorTestDisabled() = 0;
   virtual void DiscardBackbuffer() {}
diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc
index 0dd6ec7..b93ddcf 100644
--- a/cc/output/gl_renderer.cc
+++ b/cc/output/gl_renderer.cc
@@ -373,7 +373,6 @@
   capabilities_.allow_rasterize_on_demand = true;
 
   use_sync_query_ = context_caps.gpu.sync_query;
-  use_blend_minmax_ = context_caps.gpu.blend_minmax;
   use_blend_equation_advanced_ = context_caps.gpu.blend_equation_advanced;
   use_blend_equation_advanced_coherent_ =
       context_caps.gpu.blend_equation_advanced_coherent;
@@ -738,7 +737,6 @@
 
 bool GLRenderer::CanApplyBlendModeUsingBlendFunc(SkXfermode::Mode blend_mode) {
   return use_blend_equation_advanced_ ||
-         (use_blend_minmax_ && blend_mode == SkXfermode::kLighten_Mode) ||
          blend_mode == SkXfermode::kScreen_Mode ||
          blend_mode == SkXfermode::kSrcOver_Mode;
 }
@@ -804,9 +802,6 @@
   } else {
     if (blend_mode == SkXfermode::kScreen_Mode) {
       GLC(gl_, gl_->BlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ONE));
-    } else if (blend_mode == SkXfermode::kLighten_Mode) {
-      GLC(gl_, gl_->BlendFunc(GL_ONE, GL_ONE));
-      GLC(gl_, gl_->BlendEquation(GL_MAX_EXT));
     }
   }
 }
@@ -819,9 +814,6 @@
     GLC(gl_, gl_->BlendEquation(GL_FUNC_ADD));
   } else {
     GLC(gl_, gl_->BlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA));
-
-    if (blend_mode == SkXfermode::kLighten_Mode)
-      GLC(gl_, gl_->BlendEquation(GL_FUNC_ADD));
   }
 }
 
@@ -862,8 +854,8 @@
     backdrop_rect.Inset(-kOutsetForAntialiasing, -kOutsetForAntialiasing);
   }
 
-  backdrop_rect.Intersect(
-      MoveFromDrawToWindowSpace(frame->current_render_pass->output_rect));
+  backdrop_rect.Intersect(MoveFromDrawToWindowSpace(
+      frame, frame->current_render_pass->output_rect));
   return backdrop_rect;
 }
 
@@ -2038,7 +2030,7 @@
   }
 
   SkCanvas canvas(on_demand_tile_raster_bitmap_);
-  quad->picture_pile->RasterToBitmap(
+  quad->picture_pile->PlaybackToCanvas(
       &canvas, quad->content_rect, quad->contents_scale, NULL);
 
   uint8_t* bitmap_pixels = NULL;
@@ -2287,7 +2279,16 @@
 
 void GLRenderer::FinishDrawingQuadList() { FlushTextureQuadCache(); }
 
-bool GLRenderer::FlippedFramebuffer() const { return true; }
+bool GLRenderer::FlippedFramebuffer(const DrawingFrame* frame) const {
+  if (frame->current_render_pass != frame->root_render_pass)
+    return true;
+  return FlippedRootFramebuffer();
+}
+
+bool GLRenderer::FlippedRootFramebuffer() const {
+  // GL is normally flipped, so a flipped output results in an unflipping.
+  return !output_surface_->capabilities().flipped_output_surface;
+}
 
 void GLRenderer::EnsureScissorTestEnabled() {
   if (is_scissor_enabled_)
@@ -2314,7 +2315,7 @@
   gfx::Rect copy_rect = frame->current_render_pass->output_rect;
   if (request->has_area())
     copy_rect.Intersect(request->area());
-  GetFramebufferPixelsAsync(copy_rect, request.Pass());
+  GetFramebufferPixelsAsync(frame, copy_rect, request.Pass());
 }
 
 void GLRenderer::ToGLMatrix(float* gl_matrix, const gfx::Transform& transform) {
@@ -2447,7 +2448,8 @@
                                        swap_buffer_rect_.height();
     compositor_frame.gl_frame_data->sub_buffer_rect =
         gfx::Rect(swap_buffer_rect_.x(),
-                  flipped_y_pos_of_rect_bottom,
+                  FlippedRootFramebuffer() ? flipped_y_pos_of_rect_bottom
+                                           : swap_buffer_rect_.y(),
                   swap_buffer_rect_.width(),
                   swap_buffer_rect_.height());
   } else {
@@ -2496,6 +2498,7 @@
 }
 
 void GLRenderer::GetFramebufferPixelsAsync(
+    const DrawingFrame* frame,
     const gfx::Rect& rect,
     scoped_ptr<CopyOutputRequest> request) {
   DCHECK(!request->IsEmpty());
@@ -2504,7 +2507,7 @@
   if (rect.IsEmpty())
     return;
 
-  gfx::Rect window_rect = MoveFromDrawToWindowSpace(rect);
+  gfx::Rect window_rect = MoveFromDrawToWindowSpace(frame, rect);
   DCHECK_GE(window_rect.x(), 0);
   DCHECK_GE(window_rect.y(), 0);
   DCHECK_LE(window_rect.right(), current_surface_size_.width());
diff --git a/cc/output/gl_renderer.h b/cc/output/gl_renderer.h
index 625d458..ad74396 100644
--- a/cc/output/gl_renderer.h
+++ b/cc/output/gl_renderer.h
@@ -89,7 +89,8 @@
     return shared_geometry_.get();
   }
 
-  void GetFramebufferPixelsAsync(const gfx::Rect& rect,
+  void GetFramebufferPixelsAsync(const DrawingFrame* frame,
+                                 const gfx::Rect& rect,
                                  scoped_ptr<CopyOutputRequest> request);
   void GetFramebufferTexture(unsigned texture_id,
                              ResourceFormat texture_format,
@@ -114,7 +115,8 @@
   void DoDrawQuad(DrawingFrame* frame, const class DrawQuad*) override;
   void BeginDrawingFrame(DrawingFrame* frame) override;
   void FinishDrawingFrame(DrawingFrame* frame) override;
-  bool FlippedFramebuffer() const override;
+  bool FlippedFramebuffer(const DrawingFrame* frame) const override;
+  bool FlippedRootFramebuffer() const;
   void EnsureScissorTestEnabled() override;
   void EnsureScissorTestDisabled() override;
   void CopyCurrentRenderPassToBitmap(
@@ -448,7 +450,6 @@
   ScopedPtrDeque<SyncQuery> available_sync_queries_;
   scoped_ptr<SyncQuery> current_sync_query_;
   bool use_sync_query_;
-  bool use_blend_minmax_;
   bool use_blend_equation_advanced_;
   bool use_blend_equation_advanced_coherent_;
 
diff --git a/cc/output/output_surface.h b/cc/output/output_surface.h
index 2cc43a3..0a0d456 100644
--- a/cc/output/output_surface.h
+++ b/cc/output/output_surface.h
@@ -63,7 +63,8 @@
           deferred_gl_initialization(false),
           draw_and_swap_full_viewport_every_frame(false),
           adjust_deadline_for_parent(true),
-          uses_default_gl_framebuffer(true) {}
+          uses_default_gl_framebuffer(true),
+          flipped_output_surface(false) {}
     bool delegated_rendering;
     int max_frames_pending;
     bool deferred_gl_initialization;
@@ -74,6 +75,8 @@
     // Whether this output surface renders to the default OpenGL zero
     // framebuffer or to an offscreen framebuffer.
     bool uses_default_gl_framebuffer;
+    // Whether this OutputSurface is flipped or not.
+    bool flipped_output_surface;
   };
 
   const Capabilities& capabilities() const {
diff --git a/cc/output/renderer_pixeltest.cc b/cc/output/renderer_pixeltest.cc
index b2be4e6..a0ce823 100644
--- a/cc/output/renderer_pixeltest.cc
+++ b/cc/output/renderer_pixeltest.cc
@@ -1764,6 +1764,162 @@
       ExactPixelComparator(true)));
 }
 
+typedef RendererPixelTest<GLRendererWithFlippedSurface>
+    GLRendererPixelTestWithFlippedOutputSurface;
+
+TEST_F(GLRendererPixelTestWithFlippedOutputSurface, ExplicitFlipTest) {
+  // This draws a blue rect above a yellow rect with an inverted output surface.
+  gfx::Rect viewport_rect(this->device_viewport_size_);
+
+  RenderPassId root_pass_id(1, 1);
+  scoped_ptr<RenderPass> root_pass =
+      CreateTestRootRenderPass(root_pass_id, viewport_rect);
+
+  RenderPassId child_pass_id(2, 2);
+  gfx::Rect pass_rect(this->device_viewport_size_);
+  gfx::Transform transform_to_root;
+  scoped_ptr<RenderPass> child_pass =
+      CreateTestRenderPass(child_pass_id, pass_rect, transform_to_root);
+
+  gfx::Transform content_to_target_transform;
+  SharedQuadState* shared_state = CreateTestSharedQuadState(
+      content_to_target_transform, viewport_rect, child_pass.get());
+
+  gfx::Rect blue_rect(0,
+                      0,
+                      this->device_viewport_size_.width(),
+                      this->device_viewport_size_.height() / 2);
+  SolidColorDrawQuad* blue =
+      child_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
+  blue->SetNew(shared_state, blue_rect, blue_rect, SK_ColorBLUE, false);
+  gfx::Rect yellow_rect(0,
+                        this->device_viewport_size_.height() / 2,
+                        this->device_viewport_size_.width(),
+                        this->device_viewport_size_.height() / 2);
+  SolidColorDrawQuad* yellow =
+      child_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
+  yellow->SetNew(shared_state, yellow_rect, yellow_rect, SK_ColorYELLOW, false);
+
+  SharedQuadState* pass_shared_state =
+      CreateTestSharedQuadState(gfx::Transform(), pass_rect, root_pass.get());
+  CreateTestRenderPassDrawQuad(
+      pass_shared_state, pass_rect, child_pass_id, root_pass.get());
+
+  RenderPassList pass_list;
+  pass_list.push_back(child_pass.Pass());
+  pass_list.push_back(root_pass.Pass());
+
+  EXPECT_TRUE(this->RunPixelTest(
+      &pass_list,
+      base::FilePath(FILE_PATH_LITERAL("blue_yellow_flipped.png")),
+      ExactPixelComparator(true)));
+}
+
+TEST_F(GLRendererPixelTestWithFlippedOutputSurface, CheckChildPassUnflipped) {
+  // This draws a blue rect above a yellow rect with an inverted output surface.
+  gfx::Rect viewport_rect(this->device_viewport_size_);
+
+  RenderPassId root_pass_id(1, 1);
+  scoped_ptr<RenderPass> root_pass =
+      CreateTestRootRenderPass(root_pass_id, viewport_rect);
+
+  RenderPassId child_pass_id(2, 2);
+  gfx::Rect pass_rect(this->device_viewport_size_);
+  gfx::Transform transform_to_root;
+  scoped_ptr<RenderPass> child_pass =
+      CreateTestRenderPass(child_pass_id, pass_rect, transform_to_root);
+
+  gfx::Transform content_to_target_transform;
+  SharedQuadState* shared_state = CreateTestSharedQuadState(
+      content_to_target_transform, viewport_rect, child_pass.get());
+
+  gfx::Rect blue_rect(0,
+                      0,
+                      this->device_viewport_size_.width(),
+                      this->device_viewport_size_.height() / 2);
+  SolidColorDrawQuad* blue =
+      child_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
+  blue->SetNew(shared_state, blue_rect, blue_rect, SK_ColorBLUE, false);
+  gfx::Rect yellow_rect(0,
+                        this->device_viewport_size_.height() / 2,
+                        this->device_viewport_size_.width(),
+                        this->device_viewport_size_.height() / 2);
+  SolidColorDrawQuad* yellow =
+      child_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
+  yellow->SetNew(shared_state, yellow_rect, yellow_rect, SK_ColorYELLOW, false);
+
+  SharedQuadState* pass_shared_state =
+      CreateTestSharedQuadState(gfx::Transform(), pass_rect, root_pass.get());
+  CreateTestRenderPassDrawQuad(
+      pass_shared_state, pass_rect, child_pass_id, root_pass.get());
+
+  RenderPassList pass_list;
+  pass_list.push_back(child_pass.Pass());
+  pass_list.push_back(root_pass.Pass());
+
+  // Check that the child pass remains unflipped.
+  EXPECT_TRUE(this->RunPixelTestWithReadbackTarget(
+      &pass_list,
+      pass_list.front(),
+      base::FilePath(FILE_PATH_LITERAL("blue_yellow.png")),
+      ExactPixelComparator(true)));
+}
+
+TEST_F(GLRendererPixelTest, CheckReadbackSubset) {
+  gfx::Rect viewport_rect(this->device_viewport_size_);
+
+  RenderPassId root_pass_id(1, 1);
+  scoped_ptr<RenderPass> root_pass =
+      CreateTestRootRenderPass(root_pass_id, viewport_rect);
+
+  RenderPassId child_pass_id(2, 2);
+  gfx::Rect pass_rect(this->device_viewport_size_);
+  gfx::Transform transform_to_root;
+  scoped_ptr<RenderPass> child_pass =
+      CreateTestRenderPass(child_pass_id, pass_rect, transform_to_root);
+
+  gfx::Transform content_to_target_transform;
+  SharedQuadState* shared_state = CreateTestSharedQuadState(
+      content_to_target_transform, viewport_rect, child_pass.get());
+
+  // Draw a green quad full-size with a blue quad in the lower-right corner.
+  gfx::Rect blue_rect(this->device_viewport_size_.width() * 3 / 4,
+                      this->device_viewport_size_.height() * 3 / 4,
+                      this->device_viewport_size_.width() * 3 / 4,
+                      this->device_viewport_size_.height() * 3 / 4);
+  SolidColorDrawQuad* blue =
+      child_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
+  blue->SetNew(shared_state, blue_rect, blue_rect, SK_ColorBLUE, false);
+  gfx::Rect green_rect(0,
+                       0,
+                       this->device_viewport_size_.width(),
+                       this->device_viewport_size_.height());
+  SolidColorDrawQuad* green =
+      child_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
+  green->SetNew(shared_state, green_rect, green_rect, SK_ColorGREEN, false);
+
+  SharedQuadState* pass_shared_state =
+      CreateTestSharedQuadState(gfx::Transform(), pass_rect, root_pass.get());
+  CreateTestRenderPassDrawQuad(
+      pass_shared_state, pass_rect, child_pass_id, root_pass.get());
+
+  RenderPassList pass_list;
+  pass_list.push_back(child_pass.Pass());
+  pass_list.push_back(root_pass.Pass());
+
+  // Check that the child pass remains unflipped.
+  gfx::Rect capture_rect(this->device_viewport_size_.width() / 2,
+                         this->device_viewport_size_.height() / 2,
+                         this->device_viewport_size_.width() / 2,
+                         this->device_viewport_size_.height() / 2);
+  EXPECT_TRUE(this->RunPixelTestWithReadbackTargetAndArea(
+      &pass_list,
+      pass_list.front(),
+      base::FilePath(FILE_PATH_LITERAL("green_small_with_blue_corner.png")),
+      ExactPixelComparator(true),
+      &capture_rect));
+}
+
 TEST_F(GLRendererPixelTest, PictureDrawQuadTexture4444) {
   gfx::Size pile_tile_size(1000, 1000);
   gfx::Rect viewport(this->device_viewport_size_);
diff --git a/cc/output/shader.cc b/cc/output/shader.cc
index b2d76a7..354f65f 100644
--- a/cc/output/shader.cc
+++ b/cc/output/shader.cc
@@ -804,12 +804,12 @@
         float outLum = luminance(outColor);
         float minComp = min(min(outColor.r, outColor.g), outColor.b);
         float maxComp = max(max(outColor.r, outColor.g), outColor.b);
-        if (minComp < 0.0) {
+        if (minComp < 0.0 && outLum != minComp) {
           outColor = outLum +
                      ((outColor - vec3(outLum, outLum, outLum)) * outLum) /
                          (outLum - minComp);
         }
-        if (maxComp > alpha) {
+        if (maxComp > alpha && maxComp != outLum) {
           outColor =
               outLum +
               ((outColor - vec3(outLum, outLum, outLum)) * (alpha - outLum)) /
diff --git a/cc/output/software_renderer.cc b/cc/output/software_renderer.cc
index acc897f..010b1fa 100644
--- a/cc/output/software_renderer.cc
+++ b/cc/output/software_renderer.cc
@@ -127,7 +127,7 @@
   output_device_->ReclaimSoftwareFrame(ack.last_software_frame_id);
 }
 
-bool SoftwareRenderer::FlippedFramebuffer() const {
+bool SoftwareRenderer::FlippedFramebuffer(const DrawingFrame* frame) const {
   return false;
 }
 
@@ -568,7 +568,7 @@
   gfx::Rect copy_rect = frame->current_render_pass->output_rect;
   if (request->has_area())
     copy_rect.Intersect(request->area());
-  gfx::Rect window_copy_rect = MoveFromDrawToWindowSpace(copy_rect);
+  gfx::Rect window_copy_rect = MoveFromDrawToWindowSpace(frame, copy_rect);
 
   scoped_ptr<SkBitmap> bitmap(new SkBitmap);
   bitmap->setInfo(SkImageInfo::MakeN32Premul(window_copy_rect.width(),
diff --git a/cc/output/software_renderer.h b/cc/output/software_renderer.h
index d8b5a9d..2a672d5 100644
--- a/cc/output/software_renderer.h
+++ b/cc/output/software_renderer.h
@@ -55,7 +55,7 @@
   void DoDrawQuad(DrawingFrame* frame, const DrawQuad* quad) override;
   void BeginDrawingFrame(DrawingFrame* frame) override;
   void FinishDrawingFrame(DrawingFrame* frame) override;
-  bool FlippedFramebuffer() const override;
+  bool FlippedFramebuffer(const DrawingFrame* frame) const override;
   void EnsureScissorTestEnabled() override;
   void EnsureScissorTestDisabled() override;
   void CopyCurrentRenderPassToBitmap(
diff --git a/cc/resources/bitmap_raster_worker_pool.cc b/cc/resources/bitmap_raster_worker_pool.cc
index fd16ca3..f58f293 100644
--- a/cc/resources/bitmap_raster_worker_pool.cc
+++ b/cc/resources/bitmap_raster_worker_pool.cc
@@ -10,8 +10,8 @@
 #include "base/debug/trace_event_argument.h"
 #include "base/strings/stringprintf.h"
 #include "cc/debug/traced_value.h"
-#include "cc/resources/picture_pile_impl.h"
 #include "cc/resources/raster_buffer.h"
+#include "cc/resources/raster_source.h"
 #include "cc/resources/resource.h"
 
 namespace cc {
@@ -24,11 +24,11 @@
       : lock_(resource_provider, resource->id()) {}
 
   // Overridden from RasterBuffer:
-  void Playback(const PicturePileImpl* picture_pile,
+  void Playback(const RasterSource* raster_source,
                 const gfx::Rect& rect,
                 float scale,
                 RenderingStatsInstrumentation* stats) override {
-    picture_pile->RasterToBitmap(lock_.sk_canvas(), rect, scale, stats);
+    raster_source->PlaybackToCanvas(lock_.sk_canvas(), rect, scale, stats);
   }
 
  private:
diff --git a/cc/resources/gpu_raster_worker_pool.cc b/cc/resources/gpu_raster_worker_pool.cc
index cba427e..3237500 100644
--- a/cc/resources/gpu_raster_worker_pool.cc
+++ b/cc/resources/gpu_raster_worker_pool.cc
@@ -8,8 +8,8 @@
 
 #include "base/debug/trace_event.h"
 #include "cc/output/context_provider.h"
-#include "cc/resources/picture_pile_impl.h"
 #include "cc/resources/raster_buffer.h"
+#include "cc/resources/raster_source.h"
 #include "cc/resources/resource.h"
 #include "cc/resources/resource_provider.h"
 #include "cc/resources/scoped_gpu_raster.h"
@@ -34,14 +34,14 @@
         use_distance_field_text_(use_distance_field_text) {}
 
   // Overridden from RasterBuffer:
-  void Playback(const PicturePileImpl* picture_pile,
+  void Playback(const RasterSource* raster_source,
                 const gfx::Rect& rect,
                 float scale,
                 RenderingStatsInstrumentation* stats) override {
     // Turn on distance fields for layers that have ever animated.
     bool use_distance_field_text =
         use_distance_field_text_ ||
-        picture_pile->likely_to_be_used_for_transform_animation();
+        raster_source->SuitableForDistanceFieldText();
     SkSurface* sk_surface = lock_.GetSkSurface(use_distance_field_text);
 
     if (!sk_surface)
@@ -53,7 +53,7 @@
         skia::SharePtr(recorder.beginRecording(size.width(), size.height()));
 
     canvas->save();
-    picture_pile->RasterToBitmap(canvas.get(), rect, scale, stats);
+    raster_source->PlaybackToCanvas(canvas.get(), rect, scale, stats);
     canvas->restore();
 
     // Add the canvas and recorded picture to |multi_picture_draw_|.
diff --git a/cc/resources/one_copy_raster_worker_pool.cc b/cc/resources/one_copy_raster_worker_pool.cc
index cc5dd19..831bb76 100644
--- a/cc/resources/one_copy_raster_worker_pool.cc
+++ b/cc/resources/one_copy_raster_worker_pool.cc
@@ -51,11 +51,11 @@
   }
 
   // Overridden from RasterBuffer:
-  void Playback(const PicturePileImpl* picture_pile,
+  void Playback(const RasterSource* raster_source,
                 const gfx::Rect& rect,
                 float scale,
                 RenderingStatsInstrumentation* stats) override {
-    gfx::GpuMemoryBuffer* gpu_memory_buffer = lock_->gpu_memory_buffer();
+    gfx::GpuMemoryBuffer* gpu_memory_buffer = lock_->GetGpuMemoryBuffer();
     if (!gpu_memory_buffer)
       return;
 
@@ -63,7 +63,7 @@
                                        raster_resource_->format(),
                                        raster_resource_->size(),
                                        gpu_memory_buffer->GetStride(),
-                                       picture_pile,
+                                       raster_source,
                                        rect,
                                        scale,
                                        stats);
diff --git a/cc/resources/picture_layer_tiling.cc b/cc/resources/picture_layer_tiling.cc
index 4dc46e0..61b0362 100644
--- a/cc/resources/picture_layer_tiling.cc
+++ b/cc/resources/picture_layer_tiling.cc
@@ -126,7 +126,8 @@
     if (Tile* candidate_tile = twin_tiling->TileAt(i, j)) {
       gfx::Rect rect =
           gfx::ScaleToEnclosingRect(paint_rect, 1.0f / contents_scale_);
-      if (!client_->GetInvalidation()->Intersects(rect)) {
+      const Region* invalidation = client_->GetPendingInvalidation();
+      if (!invalidation || !invalidation->Intersects(rect)) {
         DCHECK(!candidate_tile->is_shared());
         DCHECK_EQ(i, candidate_tile->tiling_i_index());
         DCHECK_EQ(j, candidate_tile->tiling_j_index());
@@ -148,7 +149,8 @@
 }
 
 void PictureLayerTiling::CreateMissingTilesInLiveTilesRect() {
-  const PictureLayerTiling* twin_tiling = client_->GetTwinTiling(this);
+  const PictureLayerTiling* twin_tiling =
+      client_->GetPendingOrActiveTwinTiling(this);
   bool include_borders = false;
   for (TilingData::Iterator iter(
            &tiling_data_, live_tiles_rect_, include_borders);
@@ -225,7 +227,8 @@
 
     // If the layer grew, the live_tiles_rect_ is not changed, but a new row
     // and/or column of tiles may now exist inside the same live_tiles_rect_.
-    const PictureLayerTiling* twin_tiling = client_->GetTwinTiling(this);
+    const PictureLayerTiling* twin_tiling =
+        client_->GetPendingOrActiveTwinTiling(this);
     if (after_right > before_right) {
       DCHECK_EQ(after_right, before_right + 1);
       for (int j = before_top; j <= after_bottom; ++j)
@@ -247,9 +250,9 @@
     Invalidate(layer_invalidation);
   }
 
-  PicturePileImpl* pile = client_->GetPile();
+  RasterSource* raster_source = client_->GetRasterSource();
   for (TileMap::const_iterator it = tiles_.begin(); it != tiles_.end(); ++it)
-    it->second->set_picture_pile(pile);
+    it->second->set_raster_source(raster_source);
   VerifyLiveTilesRect();
 }
 
@@ -629,7 +632,8 @@
     RemoveTileAt(iter.index_x(), iter.index_y(), recycled_twin);
   }
 
-  const PictureLayerTiling* twin_tiling = client_->GetTwinTiling(this);
+  const PictureLayerTiling* twin_tiling =
+      client_->GetPendingOrActiveTwinTiling(this);
 
   // Iterate to allocate new tiles for all regions with newly exposed area.
   for (TilingData::DifferenceIterator iter(&tiling_data_,
@@ -717,7 +721,8 @@
   if (client_->RequiresHighResToDraw())
     return true;
 
-  const PictureLayerTiling* twin_tiling = client_->GetTwinTiling(this);
+  const PictureLayerTiling* twin_tiling =
+      client_->GetPendingOrActiveTwinTiling(this);
   if (!twin_tiling)
     return true;
 
@@ -740,7 +745,8 @@
 void PictureLayerTiling::UpdateTileAndTwinPriority(Tile* tile) const {
   UpdateTilePriority(tile);
 
-  const PictureLayerTiling* twin_tiling = client_->GetTwinTiling(this);
+  const PictureLayerTiling* twin_tiling =
+      client_->GetPendingOrActiveTwinTiling(this);
   if (!tile->is_shared() || !twin_tiling) {
     WhichTree tree = client_->GetTree();
     WhichTree twin_tree = tree == ACTIVE_TREE ? PENDING_TREE : ACTIVE_TREE;
diff --git a/cc/resources/picture_layer_tiling.h b/cc/resources/picture_layer_tiling.h
index f692702..17da548 100644
--- a/cc/resources/picture_layer_tiling.h
+++ b/cc/resources/picture_layer_tiling.h
@@ -38,11 +38,13 @@
   virtual scoped_refptr<Tile> CreateTile(
     PictureLayerTiling* tiling,
     const gfx::Rect& content_rect) = 0;
-  virtual PicturePileImpl* GetPile() = 0;
+  virtual RasterSource* GetRasterSource() = 0;
   virtual gfx::Size CalculateTileSize(
     const gfx::Size& content_bounds) const = 0;
-  virtual const Region* GetInvalidation() = 0;
-  virtual const PictureLayerTiling* GetTwinTiling(
+  // This invalidation region defines the area (if any, it can by null) that
+  // tiles can not be shared between pending and active trees.
+  virtual const Region* GetPendingInvalidation() = 0;
+  virtual const PictureLayerTiling* GetPendingOrActiveTwinTiling(
       const PictureLayerTiling* tiling) const = 0;
   virtual PictureLayerTiling* GetRecycledTwinTiling(
       const PictureLayerTiling* tiling) = 0;
diff --git a/cc/resources/picture_layer_tiling_set_unittest.cc b/cc/resources/picture_layer_tiling_set_unittest.cc
index 2005175..0fe8b3c 100644
--- a/cc/resources/picture_layer_tiling_set_unittest.cc
+++ b/cc/resources/picture_layer_tiling_set_unittest.cc
@@ -354,11 +354,11 @@
     }
 
     for (size_t i = 0; i < target_->num_tilings(); ++i)
-      ValidateTiling(target_->tiling_at(i), target_client_.GetPile());
+      ValidateTiling(target_->tiling_at(i), target_client_.GetRasterSource());
   }
 
   void ValidateTiling(const PictureLayerTiling* tiling,
-                      const PicturePileImpl* pile) {
+                      const RasterSource* raster_source) {
     if (tiling->tiling_size().IsEmpty()) {
       EXPECT_TRUE(tiling->live_tiles_rect().IsEmpty());
     } else if (!tiling->live_tiles_rect().IsEmpty()) {
@@ -370,7 +370,7 @@
     for (size_t i = 0; i < tiles.size(); ++i) {
       const Tile* tile = tiles[i];
       ASSERT_TRUE(!!tile);
-      EXPECT_EQ(tile->picture_pile(), pile);
+      EXPECT_EQ(tile->raster_source(), raster_source);
       EXPECT_TRUE(tile->content_rect().Intersects(tiling->live_tiles_rect()))
           << "All tiles must be inside the live tiles rect."
           << " Tile rect: " << tile->content_rect().ToString()
diff --git a/cc/resources/picture_pile.cc b/cc/resources/picture_pile.cc
index 372bcbd..2f62056 100644
--- a/cc/resources/picture_pile.cc
+++ b/cc/resources/picture_pile.cc
@@ -505,7 +505,6 @@
         // the pile after each invalidation.
         is_suitable_for_gpu_rasterization_ &=
             picture->IsSuitableForGpuRasterization();
-        has_text_ |= picture->HasText();
         base::TimeDelta duration =
             stats_instrumentation->EndRecording(start_time);
         best_duration = std::min(duration, best_duration);
diff --git a/cc/resources/picture_pile.h b/cc/resources/picture_pile.h
index 595ded4..7cd2229 100644
--- a/cc/resources/picture_pile.h
+++ b/cc/resources/picture_pile.h
@@ -5,6 +5,7 @@
 #ifndef CC_RESOURCES_PICTURE_PILE_H_
 #define CC_RESOURCES_PICTURE_PILE_H_
 
+#include "base/memory/ref_counted.h"
 #include "cc/resources/picture_pile_base.h"
 #include "ui/gfx/geometry/rect.h"
 
@@ -16,6 +17,7 @@
 class CC_EXPORT PicturePile : public PicturePileBase {
  public:
   PicturePile();
+  ~PicturePile() override;
 
   // Re-record parts of the picture that are invalid.
   // Invalidations are in layer space, and will be expanded to cover everything
@@ -53,9 +55,6 @@
 
   void SetPixelRecordDistanceForTesting(int d) { pixel_record_distance_ = d; }
 
- protected:
-  ~PicturePile() override;
-
  private:
   friend class PicturePileImpl;
 
diff --git a/cc/resources/picture_pile_base.cc b/cc/resources/picture_pile_base.cc
index 45db791..e7888f7 100644
--- a/cc/resources/picture_pile_base.cc
+++ b/cc/resources/picture_pile_base.cc
@@ -47,7 +47,6 @@
       show_debug_picture_borders_(false),
       clear_canvas_with_debug_color_(kDefaultClearCanvasSetting),
       has_any_recordings_(false),
-      has_text_(false),
       is_mask_(false),
       is_solid_color_(false),
       solid_color_(SK_ColorTRANSPARENT) {
@@ -71,7 +70,6 @@
       show_debug_picture_borders_(other->show_debug_picture_borders_),
       clear_canvas_with_debug_color_(other->clear_canvas_with_debug_color_),
       has_any_recordings_(other->has_any_recordings_),
-      has_text_(other->has_text_),
       is_mask_(other->is_mask_),
       is_solid_color_(other->is_solid_color_),
       solid_color_(other->solid_color_) {
@@ -142,7 +140,7 @@
 }
 
 bool PicturePileBase::CanRaster(float contents_scale,
-                                const gfx::Rect& content_rect) {
+                                const gfx::Rect& content_rect) const {
   if (tiling_.tiling_size().IsEmpty())
     return false;
   gfx::Rect layer_rect = gfx::ScaleToEnclosingRect(
diff --git a/cc/resources/picture_pile_base.h b/cc/resources/picture_pile_base.h
index bb9116c..71e5bad 100644
--- a/cc/resources/picture_pile_base.h
+++ b/cc/resources/picture_pile_base.h
@@ -10,7 +10,6 @@
 #include <utility>
 
 #include "base/containers/hash_tables.h"
-#include "base/memory/ref_counted.h"
 #include "cc/base/cc_export.h"
 #include "cc/base/region.h"
 #include "cc/base/tiling_data.h"
@@ -26,7 +25,7 @@
 
 namespace cc {
 
-class CC_EXPORT PicturePileBase : public base::RefCounted<PicturePileBase> {
+class CC_EXPORT PicturePileBase {
  public:
   PicturePileBase();
   explicit PicturePileBase(const PicturePileBase* other);
@@ -43,14 +42,11 @@
   int num_tiles_y() const { return tiling_.num_tiles_y(); }
   gfx::Rect tile_bounds(int x, int y) const { return tiling_.TileBounds(x, y); }
   bool HasRecordingAt(int x, int y);
-  bool CanRaster(float contents_scale, const gfx::Rect& content_rect);
+  bool CanRaster(float contents_scale, const gfx::Rect& content_rect) const;
 
   // If this pile contains any valid recordings. May have false positives.
   bool HasRecordings() const { return has_any_recordings_; }
 
-  // If this pile has ever contained any recordings with text.
-  bool has_text() const { return has_text_; }
-
   bool is_solid_color() const { return is_solid_color_; }
   SkColor solid_color() const { return solid_color_; }
 
@@ -128,7 +124,6 @@
   // A hint about whether there are any recordings. This may be a false
   // positive.
   bool has_any_recordings_;
-  bool has_text_;
   bool is_mask_;
   bool is_solid_color_;
   SkColor solid_color_;
@@ -136,7 +131,6 @@
  private:
   void SetBufferPixels(int buffer_pixels);
 
-  friend class base::RefCounted<PicturePileBase>;
   DISALLOW_COPY_AND_ASSIGN(PicturePileBase);
 };
 
diff --git a/cc/resources/picture_pile_impl.cc b/cc/resources/picture_pile_impl.cc
index e8cee1e..f7c24c7 100644
--- a/cc/resources/picture_pile_impl.cc
+++ b/cc/resources/picture_pile_impl.cc
@@ -41,7 +41,7 @@
     SkCanvas* canvas,
     const gfx::Rect& canvas_rect,
     float contents_scale,
-    RenderingStatsInstrumentation* rendering_stats_instrumentation) {
+    RenderingStatsInstrumentation* rendering_stats_instrumentation) const {
   RasterCommon(canvas,
                NULL,
                canvas_rect,
@@ -59,7 +59,7 @@
       canvas, canvas, canvas_rect, contents_scale, stats_instrumentation, true);
 }
 
-void PicturePileImpl::RasterToBitmap(
+void PicturePileImpl::PlaybackToCanvas(
     SkCanvas* canvas,
     const gfx::Rect& canvas_rect,
     float contents_scale,
@@ -316,25 +316,19 @@
   SkCanvas* canvas =
       recorder.beginRecording(tiling_rect.width(), tiling_rect.height());
   if (!tiling_rect.IsEmpty())
-    RasterToBitmap(canvas, tiling_rect, 1.0, NULL);
+    PlaybackToCanvas(canvas, tiling_rect, 1.0, NULL);
   skia::RefPtr<SkPicture> picture = skia::AdoptRef(recorder.endRecording());
 
   return picture;
 }
 
-void PicturePileImpl::AnalyzeInRect(const gfx::Rect& content_rect,
-                                    float contents_scale,
-                                    PicturePileImpl::Analysis* analysis) const {
-  AnalyzeInRect(content_rect, contents_scale, analysis, NULL);
-}
-
-void PicturePileImpl::AnalyzeInRect(
+void PicturePileImpl::PerformSolidColorAnalysis(
     const gfx::Rect& content_rect,
     float contents_scale,
-    PicturePileImpl::Analysis* analysis,
+    RasterSource::SolidColorAnalysis* analysis,
     RenderingStatsInstrumentation* stats_instrumentation) const {
   DCHECK(analysis);
-  TRACE_EVENT0("cc", "PicturePileImpl::AnalyzeInRect");
+  TRACE_EVENT0("cc", "PicturePileImpl::PerformSolidColorAnalysis");
 
   gfx::Rect layer_rect = gfx::ScaleToEnclosingRect(
       content_rect, 1.0f / contents_scale);
@@ -348,14 +342,24 @@
   analysis->is_solid_color = canvas.GetColorIfSolid(&analysis->solid_color);
 }
 
-// Since there are situations when we can skip analysis, the variables have to
-// be set to their safest values. That is, we have to assume that the tile is
-// not solid color. As well, we have to assume that the tile has text so we
-// don't early out incorrectly.
-PicturePileImpl::Analysis::Analysis() : is_solid_color(false) {
+void PicturePileImpl::GatherPixelRefs(
+    const gfx::Rect& content_rect,
+    float contents_scale,
+    std::vector<SkPixelRef*>* pixel_refs) const {
+  DCHECK_EQ(0u, pixel_refs->size());
+  for (PixelRefIterator iter(content_rect, contents_scale, this); iter;
+       ++iter) {
+    pixel_refs->push_back(*iter);
+  }
 }
 
-PicturePileImpl::Analysis::~Analysis() {
+bool PicturePileImpl::CoversRect(const gfx::Rect& content_rect,
+                                 float contents_scale) const {
+  return CanRaster(contents_scale, content_rect);
+}
+
+bool PicturePileImpl::SuitableForDistanceFieldText() const {
+  return likely_to_be_used_for_transform_animation_;
 }
 
 PicturePileImpl::PixelRefIterator::PixelRefIterator(
diff --git a/cc/resources/picture_pile_impl.h b/cc/resources/picture_pile_impl.h
index 243601e..1eb2187 100644
--- a/cc/resources/picture_pile_impl.h
+++ b/cc/resources/picture_pile_impl.h
@@ -14,75 +14,58 @@
 #include "cc/base/cc_export.h"
 #include "cc/debug/rendering_stats_instrumentation.h"
 #include "cc/resources/picture_pile_base.h"
+#include "cc/resources/raster_source.h"
 #include "skia/ext/analysis_canvas.h"
 #include "skia/ext/refptr.h"
 #include "third_party/skia/include/core/SkPicture.h"
 
 namespace cc {
 
-class CC_EXPORT PicturePileImpl : public PicturePileBase {
+// TODO(vmpstr): Clean up PicturePileBase and make it a member.
+class CC_EXPORT PicturePileImpl : public PicturePileBase, public RasterSource {
  public:
   static scoped_refptr<PicturePileImpl> Create();
   static scoped_refptr<PicturePileImpl> CreateFromOther(
       const PicturePileBase* other);
 
-  // Raster a subrect of this PicturePileImpl into the given canvas. It is
-  // assumed that contents_scale has already been applied to this canvas.
-  // Writes the total number of pixels rasterized and the time spent
-  // rasterizing to the stats if the respective pointer is not NULL. When
-  // slow-down-raster-scale-factor is set to a value greater than 1, the
-  // reported rasterize time is the minimum measured value over all runs.
+  // RasterSource overrides. See RasterSource header for full description.
+  // When slow-down-raster-scale-factor is set to a value greater than 1, the
+  // reported rasterize time (in stats_instrumentation) is the minimum measured
+  // value over all runs.
+  void PlaybackToCanvas(
+      SkCanvas* canvas,
+      const gfx::Rect& canvas_rect,
+      float contents_scale,
+      RenderingStatsInstrumentation* stats_instrumentation) const override;
+  void PerformSolidColorAnalysis(
+      const gfx::Rect& content_rect,
+      float contents_scale,
+      RasterSource::SolidColorAnalysis* analysis,
+      RenderingStatsInstrumentation* stats_instrumentation) const override;
+  void GatherPixelRefs(const gfx::Rect& content_rect,
+                       float contents_scale,
+                       std::vector<SkPixelRef*>* pixel_refs) const override;
+  bool CoversRect(const gfx::Rect& content_rect,
+                  float contents_scale) const override;
+  bool SuitableForDistanceFieldText() const override;
+
+  // Raster into the canvas without applying clips.
   void RasterDirect(
       SkCanvas* canvas,
       const gfx::Rect& canvas_rect,
       float contents_scale,
-      RenderingStatsInstrumentation* rendering_stats_instrumentation);
+      RenderingStatsInstrumentation* rendering_stats_instrumentation) const;
 
-  // Similar to the above RasterDirect method, but this is a convenience method
-  // for when it is known that the raster is going to an intermediate bitmap
-  // that itself will then be blended and thus that a canvas clear is required.
-  // Note that this function may write outside the canvas_rect.
-  void RasterToBitmap(
-      SkCanvas* canvas,
-      const gfx::Rect& canvas_rect,
-      float contents_scale,
-      RenderingStatsInstrumentation* stats_instrumentation) const;
-
-  // Called when analyzing a tile. We can use AnalysisCanvas as
-  // SkDrawPictureCallback, which allows us to early out from analysis.
-  void RasterForAnalysis(
-      skia::AnalysisCanvas* canvas,
-      const gfx::Rect& canvas_rect,
-      float contents_scale,
-      RenderingStatsInstrumentation* stats_instrumentation) const;
-
+  // Tracing functionality.
+  void DidBeginTracing();
   skia::RefPtr<SkPicture> GetFlattenedPicture();
 
-  bool likely_to_be_used_for_transform_animation() const {
-    return likely_to_be_used_for_transform_animation_;
-  }
   void set_likely_to_be_used_for_transform_animation() {
     likely_to_be_used_for_transform_animation_ = true;
   }
 
-  struct CC_EXPORT Analysis {
-    Analysis();
-    ~Analysis();
-
-    bool is_solid_color;
-    SkColor solid_color;
-  };
-
-  void AnalyzeInRect(const gfx::Rect& content_rect,
-                     float contents_scale,
-                     Analysis* analysis) const;
-
-  void AnalyzeInRect(
-      const gfx::Rect& content_rect,
-      float contents_scale,
-      Analysis* analysis,
-      RenderingStatsInstrumentation* stats_instrumentation) const;
-
+  // Iterator used to return SkPixelRefs from this picture pile.
+  // Public for testing.
   class CC_EXPORT PixelRefIterator {
    public:
     PixelRefIterator(const gfx::Rect& content_rect,
@@ -105,8 +88,6 @@
     std::set<const void*> processed_pictures_;
   };
 
-  void DidBeginTracing();
-
  protected:
   friend class PicturePile;
   friend class PixelRefIterator;
@@ -118,6 +99,14 @@
  private:
   typedef std::map<const Picture*, Region> PictureRegionMap;
 
+  // Called when analyzing a tile. We can use AnalysisCanvas as
+  // SkDrawPictureCallback, which allows us to early out from analysis.
+  void RasterForAnalysis(
+      skia::AnalysisCanvas* canvas,
+      const gfx::Rect& canvas_rect,
+      float contents_scale,
+      RenderingStatsInstrumentation* stats_instrumentation) const;
+
   void CoalesceRasters(const gfx::Rect& canvas_rect,
                        const gfx::Rect& content_rect,
                        float contents_scale,
diff --git a/cc/resources/picture_pile_impl_perftest.cc b/cc/resources/picture_pile_impl_perftest.cc
index 7f12fd1..e3bbac7 100644
--- a/cc/resources/picture_pile_impl_perftest.cc
+++ b/cc/resources/picture_pile_impl_perftest.cc
@@ -33,10 +33,11 @@
     // Content rect that will align with top-left tile at scale 1.0.
     gfx::Rect content_rect(0, 0, kTileSize, kTileSize);
 
-    PicturePileImpl::Analysis analysis;
+    RasterSource::SolidColorAnalysis analysis;
     timer_.Reset();
     do {
-      pile->AnalyzeInRect(content_rect, contents_scale, &analysis);
+      pile->PerformSolidColorAnalysis(
+          content_rect, contents_scale, &analysis, nullptr);
       timer_.NextLap();
     } while (!timer_.HasTimeLimitExpired());
 
@@ -57,10 +58,10 @@
     FakeRenderingStatsInstrumentation rendering_stats_instrumentation;
     timer_.Reset();
     do {
-      pile->RasterToBitmap(&canvas,
-                           content_rect,
-                           contents_scale,
-                           &rendering_stats_instrumentation);
+      pile->PlaybackToCanvas(&canvas,
+                             content_rect,
+                             contents_scale,
+                             &rendering_stats_instrumentation);
       timer_.NextLap();
     } while (!timer_.HasTimeLimitExpired());
 
diff --git a/cc/resources/picture_pile_impl_unittest.cc b/cc/resources/picture_pile_impl_unittest.cc
index 0ced279..bd796a5 100644
--- a/cc/resources/picture_pile_impl_unittest.cc
+++ b/cc/resources/picture_pile_impl_unittest.cc
@@ -37,9 +37,9 @@
   // Ensure everything is solid
   for (int y = 0; y <= 300; y += 100) {
     for (int x = 0; x <= 300; x += 100) {
-      PicturePileImpl::Analysis analysis;
+      RasterSource::SolidColorAnalysis analysis;
       gfx::Rect rect(x, y, 100, 100);
-      pile->AnalyzeInRect(rect, 1.0, &analysis);
+      pile->PerformSolidColorAnalysis(rect, 1.0, &analysis, nullptr);
       EXPECT_TRUE(analysis.is_solid_color) << rect.ToString();
       EXPECT_EQ(analysis.solid_color, solid_color) << rect.ToString();
     }
@@ -49,27 +49,32 @@
   pile->add_draw_rect_with_paint(gfx::Rect(50, 50, 1, 1), non_solid_paint);
   pile->RerecordPile();
 
-  PicturePileImpl::Analysis analysis;
-  pile->AnalyzeInRect(gfx::Rect(0, 0, 100, 100), 1.0, &analysis);
+  RasterSource::SolidColorAnalysis analysis;
+  pile->PerformSolidColorAnalysis(
+      gfx::Rect(0, 0, 100, 100), 1.0, &analysis, nullptr);
   EXPECT_FALSE(analysis.is_solid_color);
 
-  pile->AnalyzeInRect(gfx::Rect(100, 0, 100, 100), 1.0, &analysis);
+  pile->PerformSolidColorAnalysis(
+      gfx::Rect(100, 0, 100, 100), 1.0, &analysis, nullptr);
   EXPECT_TRUE(analysis.is_solid_color);
   EXPECT_EQ(analysis.solid_color, solid_color);
 
   // Boundaries should be clipped
   analysis.is_solid_color = false;
-  pile->AnalyzeInRect(gfx::Rect(350, 0, 100, 100), 1.0, &analysis);
+  pile->PerformSolidColorAnalysis(
+      gfx::Rect(350, 0, 100, 100), 1.0, &analysis, nullptr);
   EXPECT_TRUE(analysis.is_solid_color);
   EXPECT_EQ(analysis.solid_color, solid_color);
 
   analysis.is_solid_color = false;
-  pile->AnalyzeInRect(gfx::Rect(0, 350, 100, 100), 1.0, &analysis);
+  pile->PerformSolidColorAnalysis(
+      gfx::Rect(0, 350, 100, 100), 1.0, &analysis, nullptr);
   EXPECT_TRUE(analysis.is_solid_color);
   EXPECT_EQ(analysis.solid_color, solid_color);
 
   analysis.is_solid_color = false;
-  pile->AnalyzeInRect(gfx::Rect(350, 350, 100, 100), 1.0, &analysis);
+  pile->PerformSolidColorAnalysis(
+      gfx::Rect(350, 350, 100, 100), 1.0, &analysis, nullptr);
   EXPECT_TRUE(analysis.is_solid_color);
   EXPECT_EQ(analysis.solid_color, solid_color);
 }
@@ -95,9 +100,9 @@
   // Ensure everything is solid
   for (int y = 0; y <= 30; y += 10) {
     for (int x = 0; x <= 30; x += 10) {
-      PicturePileImpl::Analysis analysis;
+      RasterSource::SolidColorAnalysis analysis;
       gfx::Rect rect(x, y, 10, 10);
-      pile->AnalyzeInRect(rect, 0.1f, &analysis);
+      pile->PerformSolidColorAnalysis(rect, 0.1f, &analysis, nullptr);
       EXPECT_TRUE(analysis.is_solid_color) << rect.ToString();
       EXPECT_EQ(analysis.solid_color, solid_color) << rect.ToString();
     }
@@ -107,27 +112,32 @@
   pile->add_draw_rect_with_paint(gfx::Rect(50, 50, 1, 1), non_solid_paint);
   pile->RerecordPile();
 
-  PicturePileImpl::Analysis analysis;
-  pile->AnalyzeInRect(gfx::Rect(0, 0, 10, 10), 0.1f, &analysis);
+  RasterSource::SolidColorAnalysis analysis;
+  pile->PerformSolidColorAnalysis(
+      gfx::Rect(0, 0, 10, 10), 0.1f, &analysis, nullptr);
   EXPECT_FALSE(analysis.is_solid_color);
 
-  pile->AnalyzeInRect(gfx::Rect(10, 0, 10, 10), 0.1f, &analysis);
+  pile->PerformSolidColorAnalysis(
+      gfx::Rect(10, 0, 10, 10), 0.1f, &analysis, nullptr);
   EXPECT_TRUE(analysis.is_solid_color);
   EXPECT_EQ(analysis.solid_color, solid_color);
 
   // Boundaries should be clipped
   analysis.is_solid_color = false;
-  pile->AnalyzeInRect(gfx::Rect(35, 0, 10, 10), 0.1f, &analysis);
+  pile->PerformSolidColorAnalysis(
+      gfx::Rect(35, 0, 10, 10), 0.1f, &analysis, nullptr);
   EXPECT_TRUE(analysis.is_solid_color);
   EXPECT_EQ(analysis.solid_color, solid_color);
 
   analysis.is_solid_color = false;
-  pile->AnalyzeInRect(gfx::Rect(0, 35, 10, 10), 0.1f, &analysis);
+  pile->PerformSolidColorAnalysis(
+      gfx::Rect(0, 35, 10, 10), 0.1f, &analysis, nullptr);
   EXPECT_TRUE(analysis.is_solid_color);
   EXPECT_EQ(analysis.solid_color, solid_color);
 
   analysis.is_solid_color = false;
-  pile->AnalyzeInRect(gfx::Rect(35, 35, 10, 10), 0.1f, &analysis);
+  pile->PerformSolidColorAnalysis(
+      gfx::Rect(35, 35, 10, 10), 0.1f, &analysis, nullptr);
   EXPECT_TRUE(analysis.is_solid_color);
   EXPECT_EQ(analysis.solid_color, solid_color);
 }
@@ -138,10 +148,11 @@
 
   scoped_refptr<FakePicturePileImpl> pile =
       FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
-  PicturePileImpl::Analysis analysis;
+  RasterSource::SolidColorAnalysis analysis;
   EXPECT_FALSE(analysis.is_solid_color);
 
-  pile->AnalyzeInRect(gfx::Rect(0, 0, 400, 400), 1.f, &analysis);
+  pile->PerformSolidColorAnalysis(
+      gfx::Rect(0, 0, 400, 400), 1.f, &analysis, nullptr);
 
   EXPECT_TRUE(analysis.is_solid_color);
   EXPECT_EQ(analysis.solid_color, SkColorSetARGB(0, 0, 0, 0));
@@ -687,10 +698,10 @@
 
       FakeRenderingStatsInstrumentation rendering_stats_instrumentation;
 
-      pile->RasterToBitmap(&canvas,
-                           canvas_rect,
-                           contents_scale,
-                           &rendering_stats_instrumentation);
+      pile->PlaybackToCanvas(&canvas,
+                             canvas_rect,
+                             contents_scale,
+                             &rendering_stats_instrumentation);
 
       SkColor* pixels = reinterpret_cast<SkColor*>(bitmap.getPixels());
       int num_pixels = bitmap.width() * bitmap.height();
@@ -738,7 +749,7 @@
   SkCanvas canvas(bitmap);
 
   FakeRenderingStatsInstrumentation rendering_stats_instrumentation;
-  pile->RasterToBitmap(
+  pile->PlaybackToCanvas(
       &canvas, canvas_rect, contents_scale, &rendering_stats_instrumentation);
 
   SkColor* pixels = reinterpret_cast<SkColor*>(bitmap.getPixels());
@@ -784,10 +795,10 @@
   SkCanvas canvas(bitmap);
 
   FakeRenderingStatsInstrumentation rendering_stats_instrumentation;
-  pile->RasterToBitmap(&canvas,
-                       gfx::Rect(content_bounds),
-                       contents_scale,
-                       &rendering_stats_instrumentation);
+  pile->PlaybackToCanvas(&canvas,
+                         gfx::Rect(content_bounds),
+                         contents_scale,
+                         &rendering_stats_instrumentation);
 
   for (int y = 0; y < bitmap.height(); y++) {
     for (int x = 0; x < bitmap.width(); x++) {
diff --git a/cc/resources/picture_pile_unittest.cc b/cc/resources/picture_pile_unittest.cc
index 537872d..d6d75fa 100644
--- a/cc/resources/picture_pile_unittest.cc
+++ b/cc/resources/picture_pile_unittest.cc
@@ -17,6 +17,8 @@
 
 class TestPicturePile : public PicturePile {
  public:
+  ~TestPicturePile() override {}
+
   using PicturePile::buffer_pixels;
   using PicturePile::CanRasterSlowTileCheck;
   using PicturePile::Clear;
@@ -31,9 +33,6 @@
   typedef PicturePile::PictureInfo PictureInfo;
   typedef PicturePile::PictureMapKey PictureMapKey;
   typedef PicturePile::PictureMap PictureMap;
-
- protected:
-  ~TestPicturePile() override {}
 };
 
 class PicturePileTestBase {
@@ -45,11 +44,10 @@
         contents_opaque_(false) {}
 
   void InitializeData() {
-    pile_ = make_scoped_refptr(new TestPicturePile());
-    pile_->SetTileGridSize(gfx::Size(1000, 1000));
-    pile_->SetMinContentsScale(min_scale_);
+    pile_.SetTileGridSize(gfx::Size(1000, 1000));
+    pile_.SetMinContentsScale(min_scale_);
     client_ = FakeContentLayerClient();
-    SetTilingSize(pile_->tiling().max_texture_size());
+    SetTilingSize(pile_.tiling().max_texture_size());
   }
 
   void SetTilingSize(const gfx::Size& tiling_size) {
@@ -58,23 +56,23 @@
     UpdateAndExpandInvalidation(&invalidation, tiling_size, viewport_rect);
   }
 
-  gfx::Size tiling_size() const { return pile_->tiling_size(); }
-  gfx::Rect tiling_rect() const { return gfx::Rect(pile_->tiling_size()); }
+  gfx::Size tiling_size() const { return pile_.tiling_size(); }
+  gfx::Rect tiling_rect() const { return gfx::Rect(pile_.tiling_size()); }
 
   bool UpdateAndExpandInvalidation(Region* invalidation,
                                    const gfx::Size& layer_size,
                                    const gfx::Rect& visible_layer_rect) {
     frame_number_++;
-    return pile_->UpdateAndExpandInvalidation(&client_,
-                                              invalidation,
-                                              background_color_,
-                                              contents_opaque_,
-                                              false,
-                                              layer_size,
-                                              visible_layer_rect,
-                                              frame_number_,
-                                              Picture::RECORD_NORMALLY,
-                                              &stats_instrumentation_);
+    return pile_.UpdateAndExpandInvalidation(&client_,
+                                             invalidation,
+                                             background_color_,
+                                             contents_opaque_,
+                                             false,
+                                             layer_size,
+                                             visible_layer_rect,
+                                             frame_number_,
+                                             Picture::RECORD_NORMALLY,
+                                             &stats_instrumentation_);
   }
 
   bool UpdateWholePile() {
@@ -87,7 +85,7 @@
 
   FakeContentLayerClient client_;
   FakeRenderingStatsInstrumentation stats_instrumentation_;
-  scoped_refptr<TestPicturePile> pile_;
+  TestPicturePile pile_;
   SkColor background_color_;
   float min_scale_;
   int frame_number_;
@@ -101,17 +99,17 @@
 
 TEST_F(PicturePileTest, InvalidationOnTileBorderOutsideInterestRect) {
   // Don't expand the interest rect past what we invalidate.
-  pile_->SetPixelRecordDistanceForTesting(0);
+  pile_.SetPixelRecordDistanceForTesting(0);
 
   gfx::Size tile_size(100, 100);
-  pile_->tiling().SetMaxTextureSize(tile_size);
+  pile_.tiling().SetMaxTextureSize(tile_size);
 
   gfx::Size pile_size(400, 400);
   SetTilingSize(pile_size);
 
   // We have multiple tiles.
-  EXPECT_GT(pile_->tiling().num_tiles_x(), 2);
-  EXPECT_GT(pile_->tiling().num_tiles_y(), 2);
+  EXPECT_GT(pile_.tiling().num_tiles_x(), 2);
+  EXPECT_GT(pile_.tiling().num_tiles_y(), 2);
 
   // Record everything.
   Region invalidation(tiling_rect());
@@ -145,10 +143,10 @@
   // This is the VV interest rect which will be entirely inside 1,0 and not
   // touch the border of 1,1.
   gfx::Rect interest_rect(
-      pile_->tiling().TilePositionX(1) + pile_->tiling().border_texels(),
+      pile_.tiling().TilePositionX(1) + pile_.tiling().border_texels(),
       0,
       10,
-      pile_->tiling().TileSizeY(0) - pile_->tiling().border_texels());
+      pile_.tiling().TileSizeY(0) - pile_.tiling().border_texels());
 
   // Invalidate tile 1,0 only. This is a rect that avoids the borders of any
   // other tiles.
@@ -171,7 +169,7 @@
   invalidation = invalidate_border;
   UpdateAndExpandInvalidation(&invalidation, tiling_size(), interest_rect);
   Region expected_invalidation = invalidate_border;
-  expected_invalidation.Union(pile_->tiling().TileBounds(1, 1));
+  expected_invalidation.Union(pile_.tiling().TileBounds(1, 1));
   EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString());
 }
 
@@ -181,11 +179,11 @@
   UpdateAndExpandInvalidation(&invalidate_rect, tiling_size(), tiling_rect());
   EXPECT_EQ(gfx::Rect(50, 50, 1, 1).ToString(), invalidate_rect.ToString());
 
-  EXPECT_EQ(1, pile_->tiling().num_tiles_x());
-  EXPECT_EQ(1, pile_->tiling().num_tiles_y());
+  EXPECT_EQ(1, pile_.tiling().num_tiles_x());
+  EXPECT_EQ(1, pile_.tiling().num_tiles_y());
 
   TestPicturePile::PictureInfo& picture_info =
-      pile_->picture_map().find(TestPicturePile::PictureMapKey(0, 0))->second;
+      pile_.picture_map().find(TestPicturePile::PictureMapKey(0, 0))->second;
   // We should have a picture.
   EXPECT_TRUE(!!picture_info.GetPicture());
   gfx::Rect picture_rect = gfx::ScaleToEnclosedRect(
@@ -203,17 +201,17 @@
   UpdateAndExpandInvalidation(&invalidate_rect, tiling_size(), tiling_rect());
   EXPECT_EQ(gfx::Rect(50, 50, 100, 100).ToString(), invalidate_rect.ToString());
 
-  EXPECT_EQ(1, pile_->tiling().num_tiles_x());
-  EXPECT_EQ(1, pile_->tiling().num_tiles_y());
+  EXPECT_EQ(1, pile_.tiling().num_tiles_x());
+  EXPECT_EQ(1, pile_.tiling().num_tiles_y());
 
   TestPicturePile::PictureInfo& picture_info =
-      pile_->picture_map().find(TestPicturePile::PictureMapKey(0, 0))->second;
+      pile_.picture_map().find(TestPicturePile::PictureMapKey(0, 0))->second;
   EXPECT_TRUE(!!picture_info.GetPicture());
 
-  int expected_inflation = pile_->buffer_pixels();
+  int expected_inflation = pile_.buffer_pixels();
 
   const Picture* base_picture = picture_info.GetPicture();
-  gfx::Rect base_picture_rect(pile_->tiling_size());
+  gfx::Rect base_picture_rect(pile_.tiling_size());
   base_picture_rect.Inset(-expected_inflation, -expected_inflation);
   EXPECT_EQ(base_picture_rect.ToString(),
             base_picture->LayerRect().ToString());
@@ -221,17 +219,17 @@
 
 TEST_F(PicturePileTest, InvalidateOnTileBoundaryInflated) {
   gfx::Size new_tiling_size =
-      gfx::ToCeiledSize(gfx::ScaleSize(pile_->tiling_size(), 2.f));
+      gfx::ToCeiledSize(gfx::ScaleSize(pile_.tiling_size(), 2.f));
   // This creates initial pictures.
   SetTilingSize(new_tiling_size);
 
   // Due to border pixels, we should have 3 tiles.
-  EXPECT_EQ(3, pile_->tiling().num_tiles_x());
-  EXPECT_EQ(3, pile_->tiling().num_tiles_y());
+  EXPECT_EQ(3, pile_.tiling().num_tiles_x());
+  EXPECT_EQ(3, pile_.tiling().num_tiles_y());
 
   // We should have 1/.125 - 1 = 7 border pixels.
-  EXPECT_EQ(7, pile_->buffer_pixels());
-  EXPECT_EQ(7, pile_->tiling().border_texels());
+  EXPECT_EQ(7, pile_.buffer_pixels());
+  EXPECT_EQ(7, pile_.tiling().border_texels());
 
   // Invalidate everything to have a non zero invalidation frequency.
   UpdateWholePile();
@@ -239,18 +237,18 @@
   // Invalidate something just over a tile boundary by a single pixel.
   // This will invalidate the tile (1, 1), as well as 1 row of pixels in (1, 0).
   Region invalidate_rect(
-      gfx::Rect(pile_->tiling().TileBoundsWithBorder(0, 0).right(),
-                pile_->tiling().TileBoundsWithBorder(0, 0).bottom() - 1,
+      gfx::Rect(pile_.tiling().TileBoundsWithBorder(0, 0).right(),
+                pile_.tiling().TileBoundsWithBorder(0, 0).bottom() - 1,
                 50,
                 50));
   Region expected_invalidation = invalidate_rect;
   UpdateAndExpandInvalidation(&invalidate_rect, tiling_size(), tiling_rect());
   EXPECT_EQ(expected_invalidation.ToString(), invalidate_rect.ToString());
 
-  for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) {
-    for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) {
+  for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
+    for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
       TestPicturePile::PictureInfo& picture_info =
-          pile_->picture_map()
+          pile_.picture_map()
               .find(TestPicturePile::PictureMapKey(i, j))
               ->second;
 
@@ -273,7 +271,7 @@
   UpdateWholePile();
 
   // Everything was invalidated once so far.
-  for (auto& it : pile_->picture_map()) {
+  for (auto& it : pile_.picture_map()) {
     EXPECT_FLOAT_EQ(
         1.0f / TestPicturePile::PictureInfo::INVALIDATION_FRAMES_TRACKED,
         it.second.GetInvalidationFrequencyForTesting());
@@ -284,7 +282,7 @@
   UpdateAndExpandInvalidation(&invalidation, tiling_size(), tiling_rect());
 
   // Everything was invalidated again.
-  for (auto& it : pile_->picture_map()) {
+  for (auto& it : pile_.picture_map()) {
     EXPECT_FLOAT_EQ(
         2.0f / TestPicturePile::PictureInfo::INVALIDATION_FRAMES_TRACKED,
         it.second.GetInvalidationFrequencyForTesting());
@@ -293,7 +291,7 @@
 
 TEST_F(PicturePileTest, StopRecordingOffscreenInvalidations) {
   gfx::Size new_tiling_size =
-      gfx::ToCeiledSize(gfx::ScaleSize(pile_->tiling_size(), 4.f));
+      gfx::ToCeiledSize(gfx::ScaleSize(pile_.tiling_size(), 4.f));
   SetTilingSize(new_tiling_size);
 
   gfx::Rect viewport(tiling_size().width(), 1);
@@ -304,10 +302,10 @@
   }
 
   // Make sure we have a high invalidation frequency.
-  for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) {
-    for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) {
+  for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
+    for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
       TestPicturePile::PictureInfo& picture_info =
-          pile_->picture_map()
+          pile_.picture_map()
               .find(TestPicturePile::PictureMapKey(i, j))
               ->second;
       EXPECT_FLOAT_EQ(1.0f, picture_info.GetInvalidationFrequencyForTesting())
@@ -320,10 +318,10 @@
   UpdateAndExpandInvalidation(&invalidation, tiling_size(), viewport);
   EXPECT_EQ(tiling_rect().ToString(), invalidation.ToString());
 
-  for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) {
-    for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) {
+  for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
+    for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
       TestPicturePile::PictureInfo& picture_info =
-          pile_->picture_map()
+          pile_.picture_map()
               .find(TestPicturePile::PictureMapKey(i, j))
               ->second;
       EXPECT_FLOAT_EQ(1.0f, picture_info.GetInvalidationFrequencyForTesting());
@@ -340,13 +338,13 @@
   // Update a partial tile that doesn't get recorded. We should expand the
   // invalidation to the entire tiles that overlap it.
   Region small_invalidation =
-      gfx::Rect(pile_->tiling().TileBounds(3, 4).x(),
-                pile_->tiling().TileBounds(3, 4).y() + 10,
+      gfx::Rect(pile_.tiling().TileBounds(3, 4).x(),
+                pile_.tiling().TileBounds(3, 4).y() + 10,
                 1,
                 1);
   UpdateAndExpandInvalidation(&small_invalidation, tiling_size(), viewport);
   EXPECT_TRUE(small_invalidation.Contains(gfx::UnionRects(
-      pile_->tiling().TileBounds(2, 4), pile_->tiling().TileBounds(3, 4))))
+      pile_.tiling().TileBounds(2, 4), pile_.tiling().TileBounds(3, 4))))
       << small_invalidation.ToString();
 
   // Now update with no invalidation and full viewport
@@ -355,10 +353,10 @@
       &empty_invalidation, tiling_size(), tiling_rect());
   EXPECT_EQ(Region().ToString(), empty_invalidation.ToString());
 
-  for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) {
-    for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) {
+  for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
+    for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
       TestPicturePile::PictureInfo& picture_info =
-          pile_->picture_map()
+          pile_.picture_map()
               .find(TestPicturePile::PictureMapKey(i, j))
               ->second;
       // Expect the invalidation frequency to be less than 1, since we just
@@ -373,15 +371,15 @@
 
 TEST_F(PicturePileTest, ClearingInvalidatesRecordedRect) {
   gfx::Rect rect(0, 0, 5, 5);
-  EXPECT_TRUE(pile_->CanRasterLayerRect(rect));
-  EXPECT_TRUE(pile_->CanRasterSlowTileCheck(rect));
+  EXPECT_TRUE(pile_.CanRasterLayerRect(rect));
+  EXPECT_TRUE(pile_.CanRasterSlowTileCheck(rect));
 
-  pile_->Clear();
+  pile_.Clear();
 
   // Make sure both the cache-aware check (using recorded region) and the normal
   // check are both false after clearing.
-  EXPECT_FALSE(pile_->CanRasterLayerRect(rect));
-  EXPECT_FALSE(pile_->CanRasterSlowTileCheck(rect));
+  EXPECT_FALSE(pile_.CanRasterLayerRect(rect));
+  EXPECT_FALSE(pile_.CanRasterSlowTileCheck(rect));
 }
 
 TEST_F(PicturePileTest, FrequentInvalidationCanRaster) {
@@ -390,26 +388,26 @@
   // tiles touching it, but is true for adjacent tiles, even if it
   // overlaps on borders (edge case).
   gfx::Size new_tiling_size =
-      gfx::ToCeiledSize(gfx::ScaleSize(pile_->tiling_size(), 4.f));
+      gfx::ToCeiledSize(gfx::ScaleSize(pile_.tiling_size(), 4.f));
   SetTilingSize(new_tiling_size);
 
-  gfx::Rect tile01_borders = pile_->tiling().TileBoundsWithBorder(0, 1);
-  gfx::Rect tile02_borders = pile_->tiling().TileBoundsWithBorder(0, 2);
-  gfx::Rect tile01_noborders = pile_->tiling().TileBounds(0, 1);
-  gfx::Rect tile02_noborders = pile_->tiling().TileBounds(0, 2);
+  gfx::Rect tile01_borders = pile_.tiling().TileBoundsWithBorder(0, 1);
+  gfx::Rect tile02_borders = pile_.tiling().TileBoundsWithBorder(0, 2);
+  gfx::Rect tile01_noborders = pile_.tiling().TileBounds(0, 1);
+  gfx::Rect tile02_noborders = pile_.tiling().TileBounds(0, 2);
 
   // Sanity check these two tiles are overlapping with borders, since this is
   // what the test is trying to repro.
   EXPECT_TRUE(tile01_borders.Intersects(tile02_borders));
   EXPECT_FALSE(tile01_noborders.Intersects(tile02_noborders));
   UpdateWholePile();
-  EXPECT_TRUE(pile_->CanRasterLayerRect(tile01_noborders));
-  EXPECT_TRUE(pile_->CanRasterSlowTileCheck(tile01_noborders));
-  EXPECT_TRUE(pile_->CanRasterLayerRect(tile02_noborders));
-  EXPECT_TRUE(pile_->CanRasterSlowTileCheck(tile02_noborders));
+  EXPECT_TRUE(pile_.CanRasterLayerRect(tile01_noborders));
+  EXPECT_TRUE(pile_.CanRasterSlowTileCheck(tile01_noborders));
+  EXPECT_TRUE(pile_.CanRasterLayerRect(tile02_noborders));
+  EXPECT_TRUE(pile_.CanRasterSlowTileCheck(tile02_noborders));
   // Sanity check that an initial paint goes down the fast path of having
   // a valid recorded viewport.
-  EXPECT_TRUE(!pile_->recorded_viewport().IsEmpty());
+  EXPECT_TRUE(!pile_.recorded_viewport().IsEmpty());
 
   // Update the whole layer until the invalidation frequency is high.
   for (int frame = 0; frame < 33; ++frame) {
@@ -423,42 +421,42 @@
   EXPECT_EQ(tiling_rect().ToString(), invalidation.ToString());
 
   // Sanity check some pictures exist and others don't.
-  EXPECT_TRUE(pile_->picture_map()
+  EXPECT_TRUE(pile_.picture_map()
                   .find(TestPicturePile::PictureMapKey(0, 1))
                   ->second.GetPicture());
-  EXPECT_FALSE(pile_->picture_map()
+  EXPECT_FALSE(pile_.picture_map()
                    .find(TestPicturePile::PictureMapKey(0, 2))
                    ->second.GetPicture());
 
-  EXPECT_TRUE(pile_->CanRasterLayerRect(tile01_noborders));
-  EXPECT_TRUE(pile_->CanRasterSlowTileCheck(tile01_noborders));
-  EXPECT_FALSE(pile_->CanRasterLayerRect(tile02_noborders));
-  EXPECT_FALSE(pile_->CanRasterSlowTileCheck(tile02_noborders));
+  EXPECT_TRUE(pile_.CanRasterLayerRect(tile01_noborders));
+  EXPECT_TRUE(pile_.CanRasterSlowTileCheck(tile01_noborders));
+  EXPECT_FALSE(pile_.CanRasterLayerRect(tile02_noborders));
+  EXPECT_FALSE(pile_.CanRasterSlowTileCheck(tile02_noborders));
 }
 
 TEST_F(PicturePileTest, NoInvalidationValidViewport) {
   // This test validates that the recorded_viewport cache of full tiles
   // is still valid for some use cases.  If it's not, it's a performance
   // issue because CanRaster checks will go down the slow path.
-  EXPECT_TRUE(!pile_->recorded_viewport().IsEmpty());
+  EXPECT_TRUE(!pile_.recorded_viewport().IsEmpty());
 
   // No invalidation, same viewport.
   Region invalidation;
   UpdateAndExpandInvalidation(&invalidation, tiling_size(), tiling_rect());
-  EXPECT_TRUE(!pile_->recorded_viewport().IsEmpty());
+  EXPECT_TRUE(!pile_.recorded_viewport().IsEmpty());
   EXPECT_EQ(Region().ToString(), invalidation.ToString());
 
   // Partial invalidation, same viewport.
   invalidation = gfx::Rect(0, 0, 1, 1);
   UpdateAndExpandInvalidation(&invalidation, tiling_size(), tiling_rect());
-  EXPECT_TRUE(!pile_->recorded_viewport().IsEmpty());
+  EXPECT_TRUE(!pile_.recorded_viewport().IsEmpty());
   EXPECT_EQ(gfx::Rect(0, 0, 1, 1).ToString(), invalidation.ToString());
 
   // No invalidation, changing viewport.
   invalidation = Region();
   UpdateAndExpandInvalidation(
       &invalidation, tiling_size(), gfx::Rect(5, 5, 5, 5));
-  EXPECT_TRUE(!pile_->recorded_viewport().IsEmpty());
+  EXPECT_TRUE(!pile_.recorded_viewport().IsEmpty());
   EXPECT_EQ(Region().ToString(), invalidation.ToString());
 }
 
@@ -538,15 +536,15 @@
   // Invalidation outside the recording rect should expand to the tiles it
   // covers.
   gfx::Rect recorded_over_tiles =
-      pile_->tiling().ExpandRectToTileBounds(pile_->recorded_viewport());
+      pile_.tiling().ExpandRectToTileBounds(pile_.recorded_viewport());
   gfx::Rect invalidation_outside(
       recorded_over_tiles.right(), recorded_over_tiles.y(), 30, 30);
   invalidation = invalidation_outside;
   UpdateAndExpandInvalidation(&invalidation, huge_layer_size, viewport);
   gfx::Rect expanded_recorded_viewport =
-      pile_->tiling().ExpandRectToTileBounds(pile_->recorded_viewport());
+      pile_.tiling().ExpandRectToTileBounds(pile_.recorded_viewport());
   Region expected_invalidation =
-      pile_->tiling().ExpandRectToTileBounds(invalidation_outside);
+      pile_.tiling().ExpandRectToTileBounds(invalidation_outside);
   EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString());
 }
 
@@ -598,16 +596,16 @@
   Region invalidation;
   Region expected_invalidation;
 
-  pile_->tiling().SetMaxTextureSize(gfx::Size(tile_size, tile_size));
+  pile_.tiling().SetMaxTextureSize(gfx::Size(tile_size, tile_size));
   SetTilingSize(base_tiling_size);
 
   // We should have a recording for every tile.
-  EXPECT_EQ(6, pile_->tiling().num_tiles_x());
-  EXPECT_EQ(6, pile_->tiling().num_tiles_y());
-  for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) {
-    for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) {
+  EXPECT_EQ(6, pile_.tiling().num_tiles_x());
+  EXPECT_EQ(6, pile_.tiling().num_tiles_y());
+  for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
+    for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
       TestPicturePile::PictureMapKey key(i, j);
-      TestPicturePile::PictureMap& map = pile_->picture_map();
+      TestPicturePile::PictureMap& map = pile_.picture_map();
       TestPicturePile::PictureMap::iterator it = map.find(key);
       EXPECT_TRUE(it != map.end() && it->second.GetPicture());
     }
@@ -619,12 +617,12 @@
       CornerSinglePixelRect(corner, grow_down_tiling_size));
 
   // We should have lost the recordings in the bottom row.
-  EXPECT_EQ(6, pile_->tiling().num_tiles_x());
-  EXPECT_EQ(8, pile_->tiling().num_tiles_y());
+  EXPECT_EQ(6, pile_.tiling().num_tiles_x());
+  EXPECT_EQ(8, pile_.tiling().num_tiles_y());
   for (int i = 0; i < 6; ++i) {
     for (int j = 0; j < 6; ++j) {
       TestPicturePile::PictureMapKey key(i, j);
-      TestPicturePile::PictureMap& map = pile_->picture_map();
+      TestPicturePile::PictureMap& map = pile_.picture_map();
       TestPicturePile::PictureMap::iterator it = map.find(key);
       EXPECT_EQ(j < 5, it != map.end() && it->second.GetPicture());
     }
@@ -634,8 +632,8 @@
   expected_invalidation = SubtractRegions(gfx::Rect(grow_down_tiling_size),
                                           gfx::Rect(base_tiling_size));
   // But the new pixels don't cover the whole bottom row.
-  gfx::Rect bottom_row = gfx::UnionRects(pile_->tiling().TileBounds(0, 5),
-                                         pile_->tiling().TileBounds(5, 5));
+  gfx::Rect bottom_row = gfx::UnionRects(pile_.tiling().TileBounds(0, 5),
+                                         pile_.tiling().TileBounds(5, 5));
   EXPECT_FALSE(expected_invalidation.Contains(bottom_row));
   // We invalidated the entire old bottom row.
   expected_invalidation.Union(bottom_row);
@@ -648,12 +646,12 @@
                               CornerSinglePixelRect(corner, base_tiling_size));
 
   // We should have lost the recordings that are now outside the tiling only.
-  EXPECT_EQ(6, pile_->tiling().num_tiles_x());
-  EXPECT_EQ(6, pile_->tiling().num_tiles_y());
-  for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) {
-    for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) {
+  EXPECT_EQ(6, pile_.tiling().num_tiles_x());
+  EXPECT_EQ(6, pile_.tiling().num_tiles_y());
+  for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
+    for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
       TestPicturePile::PictureMapKey key(i, j);
-      TestPicturePile::PictureMap& map = pile_->picture_map();
+      TestPicturePile::PictureMap& map = pile_.picture_map();
       TestPicturePile::PictureMap::iterator it = map.find(key);
       EXPECT_EQ(j < 6, it != map.end() && it->second.GetPicture());
     }
@@ -671,12 +669,12 @@
       CornerSinglePixelRect(corner, grow_right_tiling_size));
 
   // We should have lost the recordings in the right column.
-  EXPECT_EQ(8, pile_->tiling().num_tiles_x());
-  EXPECT_EQ(6, pile_->tiling().num_tiles_y());
+  EXPECT_EQ(8, pile_.tiling().num_tiles_x());
+  EXPECT_EQ(6, pile_.tiling().num_tiles_y());
   for (int i = 0; i < 6; ++i) {
     for (int j = 0; j < 6; ++j) {
       TestPicturePile::PictureMapKey key(i, j);
-      TestPicturePile::PictureMap& map = pile_->picture_map();
+      TestPicturePile::PictureMap& map = pile_.picture_map();
       TestPicturePile::PictureMap::iterator it = map.find(key);
       EXPECT_EQ(i < 5, it != map.end() && it->second.GetPicture());
     }
@@ -686,8 +684,8 @@
   expected_invalidation = SubtractRegions(gfx::Rect(grow_right_tiling_size),
                                           gfx::Rect(base_tiling_size));
   // But the new pixels don't cover the whole right_column.
-  gfx::Rect right_column = gfx::UnionRects(pile_->tiling().TileBounds(5, 0),
-                                           pile_->tiling().TileBounds(5, 5));
+  gfx::Rect right_column = gfx::UnionRects(pile_.tiling().TileBounds(5, 0),
+                                           pile_.tiling().TileBounds(5, 5));
   EXPECT_FALSE(expected_invalidation.Contains(right_column));
   // We invalidated the entire old right column.
   expected_invalidation.Union(right_column);
@@ -700,12 +698,12 @@
                               CornerSinglePixelRect(corner, base_tiling_size));
 
   // We should have lost the recordings that are now outside the tiling only.
-  EXPECT_EQ(6, pile_->tiling().num_tiles_x());
-  EXPECT_EQ(6, pile_->tiling().num_tiles_y());
-  for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) {
-    for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) {
+  EXPECT_EQ(6, pile_.tiling().num_tiles_x());
+  EXPECT_EQ(6, pile_.tiling().num_tiles_y());
+  for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
+    for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
       TestPicturePile::PictureMapKey key(i, j);
-      TestPicturePile::PictureMap& map = pile_->picture_map();
+      TestPicturePile::PictureMap& map = pile_.picture_map();
       TestPicturePile::PictureMap::iterator it = map.find(key);
       EXPECT_EQ(i < 6, it != map.end() && it->second.GetPicture());
     }
@@ -723,12 +721,12 @@
       CornerSinglePixelRect(corner, grow_both_tiling_size));
 
   // We should have lost the recordings in the right column and bottom row.
-  EXPECT_EQ(8, pile_->tiling().num_tiles_x());
-  EXPECT_EQ(8, pile_->tiling().num_tiles_y());
+  EXPECT_EQ(8, pile_.tiling().num_tiles_x());
+  EXPECT_EQ(8, pile_.tiling().num_tiles_y());
   for (int i = 0; i < 6; ++i) {
     for (int j = 0; j < 6; ++j) {
       TestPicturePile::PictureMapKey key(i, j);
-      TestPicturePile::PictureMap& map = pile_->picture_map();
+      TestPicturePile::PictureMap& map = pile_.picture_map();
       TestPicturePile::PictureMap::iterator it = map.find(key);
       EXPECT_EQ(i < 5 && j < 5, it != map.end() && it->second.GetPicture());
     }
@@ -739,10 +737,10 @@
                                           gfx::Rect(base_tiling_size));
   // But the new pixels don't cover the whole right_column.
   Region right_column_and_bottom_row =
-      UnionRegions(gfx::UnionRects(pile_->tiling().TileBounds(5, 0),
-                                   pile_->tiling().TileBounds(5, 5)),
-                   gfx::UnionRects(pile_->tiling().TileBounds(0, 5),
-                                   pile_->tiling().TileBounds(5, 5)));
+      UnionRegions(gfx::UnionRects(pile_.tiling().TileBounds(5, 0),
+                                   pile_.tiling().TileBounds(5, 5)),
+                   gfx::UnionRects(pile_.tiling().TileBounds(0, 5),
+                                   pile_.tiling().TileBounds(5, 5)));
   EXPECT_FALSE(expected_invalidation.Contains(right_column_and_bottom_row));
   // We invalidated the entire old right column and the old bottom row.
   expected_invalidation.Union(right_column_and_bottom_row);
@@ -753,12 +751,12 @@
   UpdateAndExpandInvalidation(&invalidation, base_tiling_size, gfx::Rect());
 
   // We should have lost the recordings that are now outside the tiling only.
-  EXPECT_EQ(6, pile_->tiling().num_tiles_x());
-  EXPECT_EQ(6, pile_->tiling().num_tiles_y());
-  for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) {
-    for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) {
+  EXPECT_EQ(6, pile_.tiling().num_tiles_x());
+  EXPECT_EQ(6, pile_.tiling().num_tiles_y());
+  for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
+    for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
       TestPicturePile::PictureMapKey key(i, j);
-      TestPicturePile::PictureMap& map = pile_->picture_map();
+      TestPicturePile::PictureMap& map = pile_.picture_map();
       TestPicturePile::PictureMap::iterator it = map.find(key);
       EXPECT_EQ(i < 6 && j < 6, it != map.end() && it->second.GetPicture());
     }
@@ -790,16 +788,16 @@
   Region invalidation;
   Region expected_invalidation;
 
-  pile_->tiling().SetMaxTextureSize(gfx::Size(tile_size, tile_size));
+  pile_.tiling().SetMaxTextureSize(gfx::Size(tile_size, tile_size));
   SetTilingSize(base_tiling_size);
 
   // We should have a recording for every tile.
-  EXPECT_EQ(6, pile_->tiling().num_tiles_x());
-  EXPECT_EQ(6, pile_->tiling().num_tiles_y());
-  for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) {
-    for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) {
+  EXPECT_EQ(6, pile_.tiling().num_tiles_x());
+  EXPECT_EQ(6, pile_.tiling().num_tiles_y());
+  for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
+    for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
       TestPicturePile::PictureMapKey key(i, j);
-      TestPicturePile::PictureMap& map = pile_->picture_map();
+      TestPicturePile::PictureMap& map = pile_.picture_map();
       TestPicturePile::PictureMap::iterator it = map.find(key);
       EXPECT_TRUE(it != map.end() && it->second.GetPicture());
     }
@@ -812,12 +810,12 @@
 
   // We should have lost the recordings in the bottom row that do not intersect
   // the interest rect.
-  EXPECT_EQ(6, pile_->tiling().num_tiles_x());
-  EXPECT_EQ(6, pile_->tiling().num_tiles_y());
-  for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) {
-    for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) {
+  EXPECT_EQ(6, pile_.tiling().num_tiles_x());
+  EXPECT_EQ(6, pile_.tiling().num_tiles_y());
+  for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
+    for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
       TestPicturePile::PictureMapKey key(i, j);
-      TestPicturePile::PictureMap& map = pile_->picture_map();
+      TestPicturePile::PictureMap& map = pile_.picture_map();
       TestPicturePile::PictureMap::iterator it = map.find(key);
       bool expect_tile;
       switch (corner) {
@@ -843,20 +841,20 @@
   switch (corner) {
     case TOP_LEFT:
     case TOP_RIGHT:
-      expected_invalidation = gfx::UnionRects(pile_->tiling().TileBounds(0, 5),
-                                              pile_->tiling().TileBounds(5, 5));
+      expected_invalidation = gfx::UnionRects(pile_.tiling().TileBounds(0, 5),
+                                              pile_.tiling().TileBounds(5, 5));
       break;
     case BOTTOM_LEFT:
-      expected_invalidation = gfx::UnionRects(pile_->tiling().TileBounds(1, 5),
-                                              pile_->tiling().TileBounds(5, 5));
-      expected_invalidation.Union(SubtractRects(
-          pile_->tiling().TileBounds(0, 5), gfx::Rect(base_tiling_size)));
+      expected_invalidation = gfx::UnionRects(pile_.tiling().TileBounds(1, 5),
+                                              pile_.tiling().TileBounds(5, 5));
+      expected_invalidation.Union(SubtractRects(pile_.tiling().TileBounds(0, 5),
+                                                gfx::Rect(base_tiling_size)));
       break;
     case BOTTOM_RIGHT:
-      expected_invalidation = gfx::UnionRects(pile_->tiling().TileBounds(0, 5),
-                                              pile_->tiling().TileBounds(4, 5));
-      expected_invalidation.Union(SubtractRects(
-          pile_->tiling().TileBounds(5, 5), gfx::Rect(base_tiling_size)));
+      expected_invalidation = gfx::UnionRects(pile_.tiling().TileBounds(0, 5),
+                                              pile_.tiling().TileBounds(4, 5));
+      expected_invalidation.Union(SubtractRects(pile_.tiling().TileBounds(5, 5),
+                                                gfx::Rect(base_tiling_size)));
       break;
   }
   EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString());
@@ -868,12 +866,12 @@
                               CornerSinglePixelRect(corner, base_tiling_size));
 
   // We should have lost nothing.
-  EXPECT_EQ(6, pile_->tiling().num_tiles_x());
-  EXPECT_EQ(6, pile_->tiling().num_tiles_y());
-  for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) {
-    for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) {
+  EXPECT_EQ(6, pile_.tiling().num_tiles_x());
+  EXPECT_EQ(6, pile_.tiling().num_tiles_y());
+  for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
+    for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
       TestPicturePile::PictureMapKey key(i, j);
-      TestPicturePile::PictureMap& map = pile_->picture_map();
+      TestPicturePile::PictureMap& map = pile_.picture_map();
       TestPicturePile::PictureMap::iterator it = map.find(key);
       EXPECT_TRUE(it != map.end() && it->second.GetPicture());
     }
@@ -891,12 +889,12 @@
       CornerSinglePixelRect(corner, grow_right_tiling_size));
 
   // We should have lost the recordings in the right column.
-  EXPECT_EQ(6, pile_->tiling().num_tiles_x());
-  EXPECT_EQ(6, pile_->tiling().num_tiles_y());
-  for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) {
-    for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) {
+  EXPECT_EQ(6, pile_.tiling().num_tiles_x());
+  EXPECT_EQ(6, pile_.tiling().num_tiles_y());
+  for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
+    for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
       TestPicturePile::PictureMapKey key(i, j);
-      TestPicturePile::PictureMap& map = pile_->picture_map();
+      TestPicturePile::PictureMap& map = pile_.picture_map();
       TestPicturePile::PictureMap::iterator it = map.find(key);
       bool expect_tile;
       switch (corner) {
@@ -922,20 +920,20 @@
   switch (corner) {
     case TOP_LEFT:
     case BOTTOM_LEFT:
-      expected_invalidation = gfx::UnionRects(pile_->tiling().TileBounds(5, 0),
-                                              pile_->tiling().TileBounds(5, 5));
+      expected_invalidation = gfx::UnionRects(pile_.tiling().TileBounds(5, 0),
+                                              pile_.tiling().TileBounds(5, 5));
       break;
     case TOP_RIGHT:
-      expected_invalidation = gfx::UnionRects(pile_->tiling().TileBounds(5, 1),
-                                              pile_->tiling().TileBounds(5, 5));
-      expected_invalidation.Union(SubtractRects(
-          pile_->tiling().TileBounds(5, 0), gfx::Rect(base_tiling_size)));
+      expected_invalidation = gfx::UnionRects(pile_.tiling().TileBounds(5, 1),
+                                              pile_.tiling().TileBounds(5, 5));
+      expected_invalidation.Union(SubtractRects(pile_.tiling().TileBounds(5, 0),
+                                                gfx::Rect(base_tiling_size)));
       break;
     case BOTTOM_RIGHT:
-      expected_invalidation = gfx::UnionRects(pile_->tiling().TileBounds(5, 0),
-                                              pile_->tiling().TileBounds(5, 4));
-      expected_invalidation.Union(SubtractRects(
-          pile_->tiling().TileBounds(5, 5), gfx::Rect(base_tiling_size)));
+      expected_invalidation = gfx::UnionRects(pile_.tiling().TileBounds(5, 0),
+                                              pile_.tiling().TileBounds(5, 4));
+      expected_invalidation.Union(SubtractRects(pile_.tiling().TileBounds(5, 5),
+                                                gfx::Rect(base_tiling_size)));
       break;
   }
   EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString());
@@ -947,12 +945,12 @@
                               CornerSinglePixelRect(corner, base_tiling_size));
 
   // We should have lost nothing.
-  EXPECT_EQ(6, pile_->tiling().num_tiles_x());
-  EXPECT_EQ(6, pile_->tiling().num_tiles_y());
-  for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) {
-    for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) {
+  EXPECT_EQ(6, pile_.tiling().num_tiles_x());
+  EXPECT_EQ(6, pile_.tiling().num_tiles_y());
+  for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
+    for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
       TestPicturePile::PictureMapKey key(i, j);
-      TestPicturePile::PictureMap& map = pile_->picture_map();
+      TestPicturePile::PictureMap& map = pile_.picture_map();
       TestPicturePile::PictureMap::iterator it = map.find(key);
       EXPECT_TRUE(it != map.end() && it->second.GetPicture());
     }
@@ -971,12 +969,12 @@
 
   // We should have lost the recordings in the right column and bottom row. The
   // tile that insects the interest rect in invalidated only on its new pixels.
-  EXPECT_EQ(6, pile_->tiling().num_tiles_x());
-  EXPECT_EQ(6, pile_->tiling().num_tiles_y());
-  for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) {
-    for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) {
+  EXPECT_EQ(6, pile_.tiling().num_tiles_x());
+  EXPECT_EQ(6, pile_.tiling().num_tiles_y());
+  for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
+    for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
       TestPicturePile::PictureMapKey key(i, j);
-      TestPicturePile::PictureMap& map = pile_->picture_map();
+      TestPicturePile::PictureMap& map = pile_.picture_map();
       TestPicturePile::PictureMap::iterator it = map.find(key);
       bool expect_tile;
       switch (corner) {
@@ -1006,34 +1004,34 @@
   // new pixels.
   switch (corner) {
     case TOP_LEFT:
-      expected_invalidation = gfx::UnionRects(pile_->tiling().TileBounds(5, 0),
-                                              pile_->tiling().TileBounds(5, 5));
+      expected_invalidation = gfx::UnionRects(pile_.tiling().TileBounds(5, 0),
+                                              pile_.tiling().TileBounds(5, 5));
       expected_invalidation.Union(gfx::UnionRects(
-          pile_->tiling().TileBounds(0, 5), pile_->tiling().TileBounds(5, 5)));
+          pile_.tiling().TileBounds(0, 5), pile_.tiling().TileBounds(5, 5)));
       break;
     case TOP_RIGHT:
-      expected_invalidation = gfx::UnionRects(pile_->tiling().TileBounds(5, 1),
-                                              pile_->tiling().TileBounds(5, 5));
+      expected_invalidation = gfx::UnionRects(pile_.tiling().TileBounds(5, 1),
+                                              pile_.tiling().TileBounds(5, 5));
       expected_invalidation.Union(gfx::UnionRects(
-          pile_->tiling().TileBounds(0, 5), pile_->tiling().TileBounds(5, 5)));
-      expected_invalidation.Union(SubtractRects(
-          pile_->tiling().TileBounds(5, 0), gfx::Rect(base_tiling_size)));
+          pile_.tiling().TileBounds(0, 5), pile_.tiling().TileBounds(5, 5)));
+      expected_invalidation.Union(SubtractRects(pile_.tiling().TileBounds(5, 0),
+                                                gfx::Rect(base_tiling_size)));
       break;
     case BOTTOM_LEFT:
-      expected_invalidation = gfx::UnionRects(pile_->tiling().TileBounds(5, 0),
-                                              pile_->tiling().TileBounds(5, 5));
+      expected_invalidation = gfx::UnionRects(pile_.tiling().TileBounds(5, 0),
+                                              pile_.tiling().TileBounds(5, 5));
       expected_invalidation.Union(gfx::UnionRects(
-          pile_->tiling().TileBounds(1, 5), pile_->tiling().TileBounds(5, 5)));
-      expected_invalidation.Union(SubtractRects(
-          pile_->tiling().TileBounds(0, 5), gfx::Rect(base_tiling_size)));
+          pile_.tiling().TileBounds(1, 5), pile_.tiling().TileBounds(5, 5)));
+      expected_invalidation.Union(SubtractRects(pile_.tiling().TileBounds(0, 5),
+                                                gfx::Rect(base_tiling_size)));
       break;
     case BOTTOM_RIGHT:
-      expected_invalidation = gfx::UnionRects(pile_->tiling().TileBounds(5, 0),
-                                              pile_->tiling().TileBounds(5, 4));
+      expected_invalidation = gfx::UnionRects(pile_.tiling().TileBounds(5, 0),
+                                              pile_.tiling().TileBounds(5, 4));
       expected_invalidation.Union(gfx::UnionRects(
-          pile_->tiling().TileBounds(0, 5), pile_->tiling().TileBounds(4, 5)));
+          pile_.tiling().TileBounds(0, 5), pile_.tiling().TileBounds(4, 5)));
       expected_invalidation.Union(SubtractRegions(
-          pile_->tiling().TileBounds(5, 5), gfx::Rect(base_tiling_size)));
+          pile_.tiling().TileBounds(5, 5), gfx::Rect(base_tiling_size)));
       break;
   }
   EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString());
@@ -1045,12 +1043,12 @@
                               CornerSinglePixelRect(corner, base_tiling_size));
 
   // We should have lost nothing.
-  EXPECT_EQ(6, pile_->tiling().num_tiles_x());
-  EXPECT_EQ(6, pile_->tiling().num_tiles_y());
-  for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) {
-    for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) {
+  EXPECT_EQ(6, pile_.tiling().num_tiles_x());
+  EXPECT_EQ(6, pile_.tiling().num_tiles_y());
+  for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
+    for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
       TestPicturePile::PictureMapKey key(i, j);
-      TestPicturePile::PictureMap& map = pile_->picture_map();
+      TestPicturePile::PictureMap& map = pile_.picture_map();
       TestPicturePile::PictureMap::iterator it = map.find(key);
       EXPECT_TRUE(it != map.end() && it->second.GetPicture());
     }
@@ -1080,16 +1078,16 @@
   Region invalidation;
   Region expected_invalidation;
 
-  pile_->tiling().SetMaxTextureSize(gfx::Size(tile_size, tile_size));
+  pile_.tiling().SetMaxTextureSize(gfx::Size(tile_size, tile_size));
   SetTilingSize(base_tiling_size);
 
   // We should have a recording for every tile.
-  EXPECT_EQ(6, pile_->tiling().num_tiles_x());
-  EXPECT_EQ(6, pile_->tiling().num_tiles_y());
-  for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) {
-    for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) {
+  EXPECT_EQ(6, pile_.tiling().num_tiles_x());
+  EXPECT_EQ(6, pile_.tiling().num_tiles_y());
+  for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
+    for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
       TestPicturePile::PictureMapKey key(i, j);
-      TestPicturePile::PictureMap& map = pile_->picture_map();
+      TestPicturePile::PictureMap& map = pile_.picture_map();
       TestPicturePile::PictureMap::iterator it = map.find(key);
       EXPECT_TRUE(it != map.end() && it->second.GetPicture());
     }
@@ -1099,12 +1097,12 @@
       &invalidation, grow_down_tiling_size, gfx::Rect(1, 1));
 
   // We should have a recording for every tile.
-  EXPECT_EQ(6, pile_->tiling().num_tiles_x());
-  EXPECT_EQ(8, pile_->tiling().num_tiles_y());
-  for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) {
-    for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) {
+  EXPECT_EQ(6, pile_.tiling().num_tiles_x());
+  EXPECT_EQ(8, pile_.tiling().num_tiles_y());
+  for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
+    for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
       TestPicturePile::PictureMapKey key(i, j);
-      TestPicturePile::PictureMap& map = pile_->picture_map();
+      TestPicturePile::PictureMap& map = pile_.picture_map();
       TestPicturePile::PictureMap::iterator it = map.find(key);
       EXPECT_TRUE(it != map.end() && it->second.GetPicture());
     }
@@ -1114,8 +1112,8 @@
   expected_invalidation = SubtractRegions(gfx::Rect(grow_down_tiling_size),
                                           gfx::Rect(base_tiling_size));
   Region bottom_row_new_pixels =
-      SubtractRegions(gfx::UnionRects(pile_->tiling().TileBounds(0, 5),
-                                      pile_->tiling().TileBounds(5, 5)),
+      SubtractRegions(gfx::UnionRects(pile_.tiling().TileBounds(0, 5),
+                                      pile_.tiling().TileBounds(5, 5)),
                       gfx::Rect(base_tiling_size));
   EXPECT_TRUE(expected_invalidation.Contains(bottom_row_new_pixels));
   EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString());
@@ -1125,12 +1123,12 @@
   UpdateAndExpandInvalidation(&invalidation, base_tiling_size, gfx::Rect(1, 1));
 
   // We should have a recording for every tile.
-  EXPECT_EQ(6, pile_->tiling().num_tiles_x());
-  EXPECT_EQ(6, pile_->tiling().num_tiles_y());
-  for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) {
-    for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) {
+  EXPECT_EQ(6, pile_.tiling().num_tiles_x());
+  EXPECT_EQ(6, pile_.tiling().num_tiles_y());
+  for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
+    for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
       TestPicturePile::PictureMapKey key(i, j);
-      TestPicturePile::PictureMap& map = pile_->picture_map();
+      TestPicturePile::PictureMap& map = pile_.picture_map();
       TestPicturePile::PictureMap::iterator it = map.find(key);
       EXPECT_TRUE(it != map.end() && it->second.GetPicture());
     }
@@ -1145,12 +1143,12 @@
       &invalidation, grow_right_tiling_size, gfx::Rect(1, 1));
 
   // We should have a recording for every tile.
-  EXPECT_EQ(8, pile_->tiling().num_tiles_x());
-  EXPECT_EQ(6, pile_->tiling().num_tiles_y());
-  for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) {
-    for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) {
+  EXPECT_EQ(8, pile_.tiling().num_tiles_x());
+  EXPECT_EQ(6, pile_.tiling().num_tiles_y());
+  for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
+    for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
       TestPicturePile::PictureMapKey key(i, j);
-      TestPicturePile::PictureMap& map = pile_->picture_map();
+      TestPicturePile::PictureMap& map = pile_.picture_map();
       TestPicturePile::PictureMap::iterator it = map.find(key);
       EXPECT_TRUE(it != map.end() && it->second.GetPicture());
     }
@@ -1160,8 +1158,8 @@
   expected_invalidation = SubtractRegions(gfx::Rect(grow_right_tiling_size),
                                           gfx::Rect(base_tiling_size));
   Region right_column_new_pixels =
-      SubtractRegions(gfx::UnionRects(pile_->tiling().TileBounds(5, 0),
-                                      pile_->tiling().TileBounds(5, 5)),
+      SubtractRegions(gfx::UnionRects(pile_.tiling().TileBounds(5, 0),
+                                      pile_.tiling().TileBounds(5, 5)),
                       gfx::Rect(base_tiling_size));
   EXPECT_TRUE(expected_invalidation.Contains(right_column_new_pixels));
   EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString());
@@ -1171,12 +1169,12 @@
   UpdateAndExpandInvalidation(&invalidation, base_tiling_size, gfx::Rect(1, 1));
 
   // We should have lost the recordings that are now outside the tiling only.
-  EXPECT_EQ(6, pile_->tiling().num_tiles_x());
-  EXPECT_EQ(6, pile_->tiling().num_tiles_y());
-  for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) {
-    for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) {
+  EXPECT_EQ(6, pile_.tiling().num_tiles_x());
+  EXPECT_EQ(6, pile_.tiling().num_tiles_y());
+  for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
+    for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
       TestPicturePile::PictureMapKey key(i, j);
-      TestPicturePile::PictureMap& map = pile_->picture_map();
+      TestPicturePile::PictureMap& map = pile_.picture_map();
       TestPicturePile::PictureMap::iterator it = map.find(key);
       EXPECT_TRUE(it != map.end() && it->second.GetPicture());
     }
@@ -1191,12 +1189,12 @@
       &invalidation, grow_both_tiling_size, gfx::Rect(1, 1));
 
   // We should have a recording for every tile.
-  EXPECT_EQ(8, pile_->tiling().num_tiles_x());
-  EXPECT_EQ(8, pile_->tiling().num_tiles_y());
-  for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) {
-    for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) {
+  EXPECT_EQ(8, pile_.tiling().num_tiles_x());
+  EXPECT_EQ(8, pile_.tiling().num_tiles_y());
+  for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
+    for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
       TestPicturePile::PictureMapKey key(i, j);
-      TestPicturePile::PictureMap& map = pile_->picture_map();
+      TestPicturePile::PictureMap& map = pile_.picture_map();
       TestPicturePile::PictureMap::iterator it = map.find(key);
       EXPECT_TRUE(it != map.end() && it->second.GetPicture());
     }
@@ -1207,10 +1205,10 @@
   expected_invalidation = SubtractRegions(gfx::Rect(grow_both_tiling_size),
                                           gfx::Rect(base_tiling_size));
   Region bottom_row_and_right_column_new_pixels = SubtractRegions(
-      UnionRegions(gfx::UnionRects(pile_->tiling().TileBounds(0, 5),
-                                   pile_->tiling().TileBounds(5, 5)),
-                   gfx::UnionRects(pile_->tiling().TileBounds(5, 0),
-                                   pile_->tiling().TileBounds(5, 5))),
+      UnionRegions(gfx::UnionRects(pile_.tiling().TileBounds(0, 5),
+                                   pile_.tiling().TileBounds(5, 5)),
+                   gfx::UnionRects(pile_.tiling().TileBounds(5, 0),
+                                   pile_.tiling().TileBounds(5, 5))),
       gfx::Rect(base_tiling_size));
   EXPECT_TRUE(
       expected_invalidation.Contains(bottom_row_and_right_column_new_pixels));
@@ -1221,12 +1219,12 @@
   UpdateAndExpandInvalidation(&invalidation, base_tiling_size, gfx::Rect());
 
   // We should have lost the recordings that are now outside the tiling only.
-  EXPECT_EQ(6, pile_->tiling().num_tiles_x());
-  EXPECT_EQ(6, pile_->tiling().num_tiles_y());
-  for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) {
-    for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) {
+  EXPECT_EQ(6, pile_.tiling().num_tiles_x());
+  EXPECT_EQ(6, pile_.tiling().num_tiles_y());
+  for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
+    for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
       TestPicturePile::PictureMapKey key(i, j);
-      TestPicturePile::PictureMap& map = pile_->picture_map();
+      TestPicturePile::PictureMap& map = pile_.picture_map();
       TestPicturePile::PictureMap::iterator it = map.find(key);
       EXPECT_TRUE(it != map.end() && it->second.GetPicture());
     }
@@ -1250,16 +1248,16 @@
   Region invalidation;
   Region expected_invalidation;
 
-  pile_->tiling().SetMaxTextureSize(gfx::Size(tile_size, tile_size));
+  pile_.tiling().SetMaxTextureSize(gfx::Size(tile_size, tile_size));
   SetTilingSize(base_tiling_size);
 
   // We should have a recording for every tile.
-  EXPECT_EQ(6, pile_->tiling().num_tiles_x());
-  EXPECT_EQ(6, pile_->tiling().num_tiles_y());
-  for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) {
-    for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) {
+  EXPECT_EQ(6, pile_.tiling().num_tiles_x());
+  EXPECT_EQ(6, pile_.tiling().num_tiles_y());
+  for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
+    for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
       TestPicturePile::PictureMapKey key(i, j);
-      TestPicturePile::PictureMap& map = pile_->picture_map();
+      TestPicturePile::PictureMap& map = pile_.picture_map();
       TestPicturePile::PictureMap::iterator it = map.find(key);
       EXPECT_TRUE(it != map.end() && it->second.GetPicture());
     }
@@ -1269,12 +1267,12 @@
       &invalidation, grow_down_tiling_size, gfx::Rect(1, 1));
 
   // We should have a recording for every tile.
-  EXPECT_EQ(6, pile_->tiling().num_tiles_x());
-  EXPECT_EQ(6, pile_->tiling().num_tiles_y());
-  for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) {
-    for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) {
+  EXPECT_EQ(6, pile_.tiling().num_tiles_x());
+  EXPECT_EQ(6, pile_.tiling().num_tiles_y());
+  for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
+    for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
       TestPicturePile::PictureMapKey key(i, j);
-      TestPicturePile::PictureMap& map = pile_->picture_map();
+      TestPicturePile::PictureMap& map = pile_.picture_map();
       TestPicturePile::PictureMap::iterator it = map.find(key);
       EXPECT_TRUE(it != map.end() && it->second.GetPicture());
     }
@@ -1290,12 +1288,12 @@
   UpdateAndExpandInvalidation(&invalidation, base_tiling_size, gfx::Rect(1, 1));
 
   // We should have a recording for every tile.
-  EXPECT_EQ(6, pile_->tiling().num_tiles_x());
-  EXPECT_EQ(6, pile_->tiling().num_tiles_y());
-  for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) {
-    for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) {
+  EXPECT_EQ(6, pile_.tiling().num_tiles_x());
+  EXPECT_EQ(6, pile_.tiling().num_tiles_y());
+  for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
+    for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
       TestPicturePile::PictureMapKey key(i, j);
-      TestPicturePile::PictureMap& map = pile_->picture_map();
+      TestPicturePile::PictureMap& map = pile_.picture_map();
       TestPicturePile::PictureMap::iterator it = map.find(key);
       EXPECT_TRUE(it != map.end() && it->second.GetPicture());
     }
@@ -1310,12 +1308,12 @@
       &invalidation, grow_right_tiling_size, gfx::Rect(1, 1));
 
   // We should have a recording for every tile.
-  EXPECT_EQ(6, pile_->tiling().num_tiles_x());
-  EXPECT_EQ(6, pile_->tiling().num_tiles_y());
-  for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) {
-    for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) {
+  EXPECT_EQ(6, pile_.tiling().num_tiles_x());
+  EXPECT_EQ(6, pile_.tiling().num_tiles_y());
+  for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
+    for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
       TestPicturePile::PictureMapKey key(i, j);
-      TestPicturePile::PictureMap& map = pile_->picture_map();
+      TestPicturePile::PictureMap& map = pile_.picture_map();
       TestPicturePile::PictureMap::iterator it = map.find(key);
       EXPECT_TRUE(it != map.end() && it->second.GetPicture());
     }
@@ -1331,12 +1329,12 @@
   UpdateAndExpandInvalidation(&invalidation, base_tiling_size, gfx::Rect(1, 1));
 
   // We should have lost the recordings that are now outside the tiling only.
-  EXPECT_EQ(6, pile_->tiling().num_tiles_x());
-  EXPECT_EQ(6, pile_->tiling().num_tiles_y());
-  for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) {
-    for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) {
+  EXPECT_EQ(6, pile_.tiling().num_tiles_x());
+  EXPECT_EQ(6, pile_.tiling().num_tiles_y());
+  for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
+    for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
       TestPicturePile::PictureMapKey key(i, j);
-      TestPicturePile::PictureMap& map = pile_->picture_map();
+      TestPicturePile::PictureMap& map = pile_.picture_map();
       TestPicturePile::PictureMap::iterator it = map.find(key);
       EXPECT_TRUE(it != map.end() && it->second.GetPicture());
     }
@@ -1351,12 +1349,12 @@
       &invalidation, grow_both_tiling_size, gfx::Rect(1, 1));
 
   // We should have a recording for every tile.
-  EXPECT_EQ(6, pile_->tiling().num_tiles_x());
-  EXPECT_EQ(6, pile_->tiling().num_tiles_y());
-  for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) {
-    for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) {
+  EXPECT_EQ(6, pile_.tiling().num_tiles_x());
+  EXPECT_EQ(6, pile_.tiling().num_tiles_y());
+  for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
+    for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
       TestPicturePile::PictureMapKey key(i, j);
-      TestPicturePile::PictureMap& map = pile_->picture_map();
+      TestPicturePile::PictureMap& map = pile_.picture_map();
       TestPicturePile::PictureMap::iterator it = map.find(key);
       EXPECT_TRUE(it != map.end() && it->second.GetPicture());
     }
@@ -1372,12 +1370,12 @@
   UpdateAndExpandInvalidation(&invalidation, base_tiling_size, gfx::Rect());
 
   // We should have lost the recordings that are now outside the tiling only.
-  EXPECT_EQ(6, pile_->tiling().num_tiles_x());
-  EXPECT_EQ(6, pile_->tiling().num_tiles_y());
-  for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) {
-    for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) {
+  EXPECT_EQ(6, pile_.tiling().num_tiles_x());
+  EXPECT_EQ(6, pile_.tiling().num_tiles_y());
+  for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
+    for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
       TestPicturePile::PictureMapKey key(i, j);
-      TestPicturePile::PictureMap& map = pile_->picture_map();
+      TestPicturePile::PictureMap& map = pile_.picture_map();
       TestPicturePile::PictureMap::iterator it = map.find(key);
       EXPECT_TRUE(it != map.end() && it->second.GetPicture());
     }
@@ -1392,8 +1390,8 @@
   // If the client has no contents, the solid state will be true.
   Region invalidation1(tiling_rect());
   UpdateAndExpandInvalidation(&invalidation1, tiling_size(), tiling_rect());
-  EXPECT_TRUE(pile_->is_solid_color());
-  EXPECT_EQ(static_cast<SkColor>(SK_ColorTRANSPARENT), pile_->solid_color());
+  EXPECT_TRUE(pile_.is_solid_color());
+  EXPECT_EQ(static_cast<SkColor>(SK_ColorTRANSPARENT), pile_.solid_color());
 
   // If there is a single rect that covers the view, the solid
   // state will be true.
@@ -1402,8 +1400,8 @@
   client_.add_draw_rect(tiling_rect(), paint);
   Region invalidation2(tiling_rect());
   UpdateAndExpandInvalidation(&invalidation2, tiling_size(), tiling_rect());
-  EXPECT_TRUE(pile_->is_solid_color());
-  EXPECT_EQ(SK_ColorCYAN, pile_->solid_color());
+  EXPECT_TRUE(pile_.is_solid_color());
+  EXPECT_EQ(SK_ColorCYAN, pile_.solid_color());
 
   // If a second smaller rect is draw that doesn't cover the viewport
   // completely, the solid state will be false.
@@ -1412,15 +1410,15 @@
   client_.add_draw_rect(smallRect, paint);
   Region invalidation3(tiling_rect());
   UpdateAndExpandInvalidation(&invalidation3, tiling_size(), tiling_rect());
-  EXPECT_FALSE(pile_->is_solid_color());
+  EXPECT_FALSE(pile_.is_solid_color());
 
   // If a third rect is drawn over everything, we should be solid again.
   paint.setColor(SK_ColorRED);
   client_.add_draw_rect(tiling_rect(), paint);
   Region invalidation4(tiling_rect());
   UpdateAndExpandInvalidation(&invalidation4, tiling_size(), tiling_rect());
-  EXPECT_TRUE(pile_->is_solid_color());
-  EXPECT_EQ(SK_ColorRED, pile_->solid_color());
+  EXPECT_TRUE(pile_.is_solid_color());
+  EXPECT_EQ(SK_ColorRED, pile_.solid_color());
 
   // If we draw too many, we don't bother doing the analysis and we should no
   // longer be in a solid state.  There are 8 rects, two clips and a translate.
@@ -1431,7 +1429,7 @@
   client_.add_draw_rect(tiling_rect(), paint);
   Region invalidation5(tiling_rect());
   UpdateAndExpandInvalidation(&invalidation5, tiling_size(), tiling_rect());
-  EXPECT_FALSE(pile_->is_solid_color());
+  EXPECT_FALSE(pile_.is_solid_color());
 }
 
 }  // namespace
diff --git a/cc/resources/pixel_buffer_raster_worker_pool.cc b/cc/resources/pixel_buffer_raster_worker_pool.cc
index 9ad641a..3409655 100644
--- a/cc/resources/pixel_buffer_raster_worker_pool.cc
+++ b/cc/resources/pixel_buffer_raster_worker_pool.cc
@@ -35,7 +35,7 @@
   }
 
   // Overridden from RasterBuffer:
-  void Playback(const PicturePileImpl* picture_pile,
+  void Playback(const RasterSource* raster_source,
                 const gfx::Rect& rect,
                 float scale,
                 RenderingStatsInstrumentation* stats) override {
@@ -46,7 +46,7 @@
                                        resource_->format(),
                                        resource_->size(),
                                        stride_,
-                                       picture_pile,
+                                       raster_source,
                                        rect,
                                        scale,
                                        stats);
diff --git a/cc/resources/raster_buffer.h b/cc/resources/raster_buffer.h
index df7ea5f..d9791e9 100644
--- a/cc/resources/raster_buffer.h
+++ b/cc/resources/raster_buffer.h
@@ -9,7 +9,7 @@
 #include "ui/gfx/geometry/rect.h"
 
 namespace cc {
-class PicturePileImpl;
+class RasterSource;
 class RenderingStatsInstrumentation;
 
 class CC_EXPORT RasterBuffer {
@@ -17,7 +17,7 @@
   RasterBuffer();
   virtual ~RasterBuffer();
 
-  virtual void Playback(const PicturePileImpl* picture_pile,
+  virtual void Playback(const RasterSource* raster_source,
                         const gfx::Rect& rect,
                         float scale,
                         RenderingStatsInstrumentation* stats) = 0;
diff --git a/cc/resources/raster_source.h b/cc/resources/raster_source.h
new file mode 100644
index 0000000..603b883
--- /dev/null
+++ b/cc/resources/raster_source.h
@@ -0,0 +1,77 @@
+// 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_RESOURCES_RASTER_SOURCE_H_
+#define CC_RESOURCES_RASTER_SOURCE_H_
+
+#include <vector>
+
+#include "base/memory/ref_counted.h"
+#include "cc/base/cc_export.h"
+#include "third_party/skia/include/core/SkColor.h"
+
+class SkCanvas;
+
+namespace cc {
+
+class RenderingStatsInstrumentation;
+
+class CC_EXPORT RasterSource : public base::RefCountedThreadSafe<RasterSource> {
+ public:
+  struct CC_EXPORT SolidColorAnalysis {
+    SolidColorAnalysis()
+        : is_solid_color(false), solid_color(SK_ColorTRANSPARENT) {}
+    ~SolidColorAnalysis() {}
+
+    bool is_solid_color;
+    SkColor solid_color;
+  };
+
+  // Raster a subrect of this RasterSource into the given canvas. It is
+  // assumed that contents_scale has already been applied to this canvas.
+  // Writes the total number of pixels rasterized and the time spent
+  // rasterizing to the stats if the respective pointer is not nullptr.
+  // TODO(vmpstr): Remove RenderingStatsInstrumentation from the interface.
+  virtual void PlaybackToCanvas(
+      SkCanvas* canvas,
+      const gfx::Rect& canvas_rect,
+      float contents_scale,
+      RenderingStatsInstrumentation* rendering_stats_instrumentation) const = 0;
+
+  // Analyze to determine if the given rect at given scale is of solid color in
+  // this raster source.
+  virtual void PerformSolidColorAnalysis(
+      const gfx::Rect& content_rect,
+      float contents_scale,
+      SolidColorAnalysis* analysis,
+      RenderingStatsInstrumentation* rendering_stats_instrumentation) const = 0;
+
+  // Populate the given list with all SkPixelRefs that may overlap the given
+  // rect at given scale.
+  virtual void GatherPixelRefs(const gfx::Rect& content_rect,
+                               float contents_scale,
+                               std::vector<SkPixelRef*>* pixel_refs) const = 0;
+
+  // Return true iff this raster source can raster the given rect at given
+  // scale.
+  virtual bool CoversRect(const gfx::Rect& content_rect,
+                          float contents_scale) const = 0;
+
+  // Return true iff this raster source would benefit from using distance
+  // field text.
+  virtual bool SuitableForDistanceFieldText() const = 0;
+
+ protected:
+  friend class base::RefCountedThreadSafe<RasterSource>;
+
+  RasterSource() {}
+  virtual ~RasterSource() {}
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(RasterSource);
+};
+
+}  // namespace cc
+
+#endif  // CC_RESOURCES_RASTER_SOURCE_H_
diff --git a/cc/resources/raster_worker_pool.cc b/cc/resources/raster_worker_pool.cc
index a52e019..bd91740 100644
--- a/cc/resources/raster_worker_pool.cc
+++ b/cc/resources/raster_worker_pool.cc
@@ -11,7 +11,8 @@
 #include "base/strings/stringprintf.h"
 #include "base/threading/simple_thread.h"
 #include "cc/base/scoped_ptr_deque.h"
-#include "cc/resources/picture_pile_impl.h"
+#include "cc/resources/raster_source.h"
+#include "third_party/skia/include/core/SkCanvas.h"
 
 namespace cc {
 namespace {
@@ -198,7 +199,7 @@
                                         ResourceFormat format,
                                         const gfx::Size& size,
                                         int stride,
-                                        const PicturePileImpl* picture_pile,
+                                        const RasterSource* raster_source,
                                         const gfx::Rect& rect,
                                         float scale,
                                         RenderingStatsInstrumentation* stats) {
@@ -225,7 +226,7 @@
   }
 
   SkCanvas canvas(bitmap);
-  picture_pile->RasterToBitmap(&canvas, rect, scale, stats);
+  raster_source->PlaybackToCanvas(&canvas, rect, scale, stats);
 
   SkColorType buffer_color_type = ResourceFormatToSkColorType(format);
   if (buffer_color_type != bitmap.colorType()) {
diff --git a/cc/resources/raster_worker_pool.h b/cc/resources/raster_worker_pool.h
index d3c2e35..30d26e5 100644
--- a/cc/resources/raster_worker_pool.h
+++ b/cc/resources/raster_worker_pool.h
@@ -14,7 +14,7 @@
 }
 
 namespace cc {
-class PicturePileImpl;
+class RasterSource;
 class RenderingStatsInstrumentation;
 
 class CC_EXPORT RasterWorkerPool {
@@ -70,7 +70,7 @@
                                ResourceFormat format,
                                const gfx::Size& size,
                                int stride,
-                               const PicturePileImpl* picture_pile,
+                               const RasterSource* raster_source,
                                const gfx::Rect& rect,
                                float scale,
                                RenderingStatsInstrumentation* stats);
diff --git a/cc/resources/raster_worker_pool_unittest.cc b/cc/resources/raster_worker_pool_unittest.cc
index a6d6c65..c8feb73 100644
--- a/cc/resources/raster_worker_pool_unittest.cc
+++ b/cc/resources/raster_worker_pool_unittest.cc
@@ -46,8 +46,8 @@
 
 class TestRasterTaskImpl : public RasterTask {
  public:
-  typedef base::Callback<
-      void(const PicturePileImpl::Analysis& analysis, bool was_canceled)> Reply;
+  typedef base::Callback<void(const RasterSource::SolidColorAnalysis& analysis,
+                              bool was_canceled)> Reply;
 
   TestRasterTaskImpl(const Resource* resource,
                      const Reply& reply,
@@ -71,7 +71,7 @@
     client->ReleaseBufferForRaster(raster_buffer_.Pass());
   }
   void RunReplyOnOriginThread() override {
-    reply_.Run(PicturePileImpl::Analysis(), !HasFinishedRunning());
+    reply_.Run(RasterSource::SolidColorAnalysis(), !HasFinishedRunning());
   }
 
  protected:
@@ -298,7 +298,7 @@
 
   void OnTaskCompleted(scoped_ptr<ScopedResource> resource,
                        unsigned id,
-                       const PicturePileImpl::Analysis& analysis,
+                       const RasterSource::SolidColorAnalysis& analysis,
                        bool was_canceled) {
     RasterTaskResult result;
     result.id = id;
diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc
index a37789a..14f4880 100644
--- a/cc/resources/resource_provider.cc
+++ b/cc/resources/resource_provider.cc
@@ -14,7 +14,6 @@
 #include "base/strings/string_util.h"
 #include "cc/base/util.h"
 #include "cc/output/gl_renderer.h"  // For the GLC() macro.
-#include "cc/resources/gpu_memory_buffer_manager.h"
 #include "cc/resources/platform_color.h"
 #include "cc/resources/returned_resource.h"
 #include "cc/resources/shared_bitmap_manager.h"
@@ -22,6 +21,7 @@
 #include "cc/resources/transferable_resource.h"
 #include "gpu/GLES2/gl2extchromium.h"
 #include "gpu/command_buffer/client/gles2_interface.h"
+#include "gpu/command_buffer/client/gpu_memory_buffer_manager.h"
 #include "third_party/khronos/GLES2/gl2.h"
 #include "third_party/khronos/GLES2/gl2ext.h"
 #include "third_party/skia/include/core/SkSurface.h"
@@ -407,7 +407,7 @@
 scoped_ptr<ResourceProvider> ResourceProvider::Create(
     OutputSurface* output_surface,
     SharedBitmapManager* shared_bitmap_manager,
-    GpuMemoryBufferManager* gpu_memory_buffer_manager,
+    gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
     BlockingTaskRunner* blocking_main_thread_task_runner,
     int highp_threshold_min,
     bool use_rgba_4444_texture_format,
@@ -922,11 +922,9 @@
   }
 }
 
-const ResourceProvider::Resource* ResourceProvider::LockForWrite(
-    ResourceId id) {
+ResourceProvider::Resource* ResourceProvider::LockForWrite(ResourceId id) {
   Resource* resource = GetResource(id);
   DCHECK(CanLockForWrite(id));
-  LazyAllocate(resource);
 
   resource->locked_for_write = true;
   return resource;
@@ -939,77 +937,13 @@
          !resource->lost && ReadLockFenceHasPassed(resource);
 }
 
-void ResourceProvider::UnlockForWrite(ResourceId id) {
-  Resource* resource = GetResource(id);
+void ResourceProvider::UnlockForWrite(ResourceProvider::Resource* resource) {
   DCHECK(resource->locked_for_write);
   DCHECK_EQ(resource->exported_count, 0);
   DCHECK(resource->origin == Resource::Internal);
   resource->locked_for_write = false;
 }
 
-const ResourceProvider::Resource*
-ResourceProvider::LockForWriteToGpuMemoryBuffer(ResourceId id) {
-  Resource* resource = GetResource(id);
-  DCHECK_EQ(GLTexture, resource->type);
-  DCHECK(CanLockForWrite(id));
-
-  if (!resource->gpu_memory_buffer) {
-    scoped_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer =
-        gpu_memory_buffer_manager_->AllocateGpuMemoryBuffer(
-            resource->size,
-            ToGpuMemoryBufferFormat(resource->format),
-            gfx::GpuMemoryBuffer::MAP);
-    resource->gpu_memory_buffer = gpu_memory_buffer.release();
-    resource->allocated = true;
-  }
-
-  resource->locked_for_write = true;
-  return resource;
-}
-
-void ResourceProvider::UnlockForWriteToGpuMemoryBuffer(ResourceId id) {
-  Resource* resource = GetResource(id);
-  DCHECK(resource->locked_for_write);
-  DCHECK_EQ(resource->exported_count, 0);
-  DCHECK(resource->origin == Resource::Internal);
-  DCHECK_EQ(GLTexture, resource->type);
-
-  if (!resource->image_id) {
-    GLES2Interface* gl = ContextGL();
-    DCHECK(gl);
-    resource->image_id =
-        gl->CreateImageCHROMIUM(resource->gpu_memory_buffer->AsClientBuffer(),
-                                resource->size.width(),
-                                resource->size.height(),
-                                GL_RGBA);
-  }
-
-  resource->locked_for_write = false;
-  resource->dirty_image = true;
-
-  // GpuMemoryBuffer provides direct access to the memory used by the GPU.
-  // Read lock fences are required to ensure that we're not trying to map a
-  // buffer that is currently in-use by the GPU.
-  resource->read_lock_fences_enabled = true;
-}
-
-void ResourceProvider::LockForWriteToSkSurface(ResourceId id) {
-  Resource* resource = GetResource(id);
-  DCHECK_EQ(GLTexture, resource->type);
-  DCHECK(CanLockForWrite(id));
-
-  resource->locked_for_write = true;
-}
-
-void ResourceProvider::UnlockForWriteToSkSurface(ResourceId id) {
-  Resource* resource = GetResource(id);
-  DCHECK(resource->locked_for_write);
-  DCHECK_EQ(resource->exported_count, 0);
-  DCHECK(resource->origin == Resource::Internal);
-  DCHECK_EQ(GLTexture, resource->type);
-  resource->locked_for_write = false;
-}
-
 ResourceProvider::ScopedReadLockGL::ScopedReadLockGL(
     ResourceProvider* resource_provider,
     ResourceProvider::ResourceId resource_id)
@@ -1049,13 +983,14 @@
     ResourceProvider* resource_provider,
     ResourceProvider::ResourceId resource_id)
     : resource_provider_(resource_provider),
-      resource_id_(resource_id),
-      texture_id_(resource_provider->LockForWrite(resource_id)->gl_id) {
+      resource_(resource_provider->LockForWrite(resource_id)) {
+  resource_provider_->LazyAllocate(resource_);
+  texture_id_ = resource_->gl_id;
   DCHECK(texture_id_);
 }
 
 ResourceProvider::ScopedWriteLockGL::~ScopedWriteLockGL() {
-  resource_provider_->UnlockForWrite(resource_id_);
+  resource_provider_->UnlockForWrite(resource_);
 }
 
 void ResourceProvider::PopulateSkBitmapWithResource(
@@ -1084,82 +1019,117 @@
     ResourceProvider* resource_provider,
     ResourceProvider::ResourceId resource_id)
     : resource_provider_(resource_provider),
-      resource_id_(resource_id) {
-  ResourceProvider::PopulateSkBitmapWithResource(
-      &sk_bitmap_, resource_provider->LockForWrite(resource_id));
+      resource_(resource_provider->LockForWrite(resource_id)) {
+  ResourceProvider::PopulateSkBitmapWithResource(&sk_bitmap_, resource_);
   DCHECK(valid());
   sk_canvas_.reset(new SkCanvas(sk_bitmap_));
 }
 
 ResourceProvider::ScopedWriteLockSoftware::~ScopedWriteLockSoftware() {
-  resource_provider_->UnlockForWrite(resource_id_);
+  resource_provider_->UnlockForWrite(resource_);
 }
 
 ResourceProvider::ScopedWriteLockGpuMemoryBuffer::
     ScopedWriteLockGpuMemoryBuffer(ResourceProvider* resource_provider,
                                    ResourceProvider::ResourceId resource_id)
     : resource_provider_(resource_provider),
-      resource_id_(resource_id),
-      gpu_memory_buffer_(
-          resource_provider->LockForWriteToGpuMemoryBuffer(resource_id)
-              ->gpu_memory_buffer) {
+      resource_(resource_provider->LockForWrite(resource_id)),
+      gpu_memory_buffer_manager_(resource_provider->gpu_memory_buffer_manager_),
+      gpu_memory_buffer_(nullptr),
+      size_(resource_->size),
+      format_(resource_->format) {
+  DCHECK_EQ(GLTexture, resource_->type);
+  std::swap(gpu_memory_buffer_, resource_->gpu_memory_buffer);
 }
 
 ResourceProvider::ScopedWriteLockGpuMemoryBuffer::
     ~ScopedWriteLockGpuMemoryBuffer() {
-  resource_provider_->UnlockForWriteToGpuMemoryBuffer(resource_id_);
+  resource_provider_->UnlockForWrite(resource_);
+  if (!gpu_memory_buffer_)
+    return;
+
+  if (!resource_->image_id) {
+    GLES2Interface* gl = resource_provider_->ContextGL();
+    DCHECK(gl);
+
+    resource_->image_id =
+        gl->CreateImageCHROMIUM(gpu_memory_buffer_->AsClientBuffer(),
+                                size_.width(),
+                                size_.height(),
+                                GL_RGBA);
+  }
+
+  std::swap(resource_->gpu_memory_buffer, gpu_memory_buffer_);
+  resource_->allocated = true;
+  resource_->dirty_image = true;
+
+  // GpuMemoryBuffer provides direct access to the memory used by the GPU.
+  // Read lock fences are required to ensure that we're not trying to map a
+  // buffer that is currently in-use by the GPU.
+  resource_->read_lock_fences_enabled = true;
+}
+
+gfx::GpuMemoryBuffer*
+ResourceProvider::ScopedWriteLockGpuMemoryBuffer::GetGpuMemoryBuffer() {
+  if (!gpu_memory_buffer_) {
+    scoped_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer =
+        gpu_memory_buffer_manager_->AllocateGpuMemoryBuffer(
+            size_, ToGpuMemoryBufferFormat(format_), gfx::GpuMemoryBuffer::MAP);
+    gpu_memory_buffer_ = gpu_memory_buffer.release();
+  }
+
+  return gpu_memory_buffer_;
 }
 
 ResourceProvider::ScopedWriteLockGr::ScopedWriteLockGr(
     ResourceProvider* resource_provider,
     ResourceProvider::ResourceId resource_id)
-    : resource_provider_(resource_provider), resource_id_(resource_id) {
-  resource_provider->LockForWriteToSkSurface(resource_id);
+    : resource_provider_(resource_provider),
+      resource_(resource_provider->LockForWrite(resource_id)) {
 }
 
 ResourceProvider::ScopedWriteLockGr::~ScopedWriteLockGr() {
-  resource_provider_->UnlockForWriteToSkSurface(resource_id_);
+  resource_provider_->UnlockForWrite(resource_);
 }
 
 SkSurface* ResourceProvider::ScopedWriteLockGr::GetSkSurface(
     bool use_distance_field_text) {
-  Resource* resource = resource_provider_->GetResource(resource_id_);
-  DCHECK(resource->locked_for_write);
+  DCHECK(resource_->locked_for_write);
 
   // If the surface doesn't exist, or doesn't have the correct dff setting,
   // recreate the surface within the resource.
-  if (!resource->sk_surface ||
+  if (!resource_->sk_surface ||
       use_distance_field_text !=
-          resource->sk_surface->props().isUseDistanceFieldFonts()) {
+          resource_->sk_surface->props().isUseDistanceFieldFonts()) {
     class GrContext* gr_context = resource_provider_->GrContext();
     // TODO(alokp): Implement TestContextProvider::GrContext().
     if (!gr_context)
       return nullptr;
 
-    resource_provider_->LazyAllocate(resource);
+    resource_provider_->LazyAllocate(resource_);
 
     GrBackendTextureDesc desc;
     desc.fFlags = kRenderTarget_GrBackendTextureFlag;
-    desc.fWidth = resource->size.width();
-    desc.fHeight = resource->size.height();
-    desc.fConfig = ToGrPixelConfig(resource->format);
+    desc.fWidth = resource_->size.width();
+    desc.fHeight = resource_->size.height();
+    desc.fConfig = ToGrPixelConfig(resource_->format);
     desc.fOrigin = kTopLeft_GrSurfaceOrigin;
-    desc.fTextureHandle = resource->gl_id;
+    desc.fTextureHandle = resource_->gl_id;
     skia::RefPtr<GrTexture> gr_texture =
         skia::AdoptRef(gr_context->wrapBackendTexture(desc));
     SkSurface::TextRenderMode text_render_mode =
         use_distance_field_text ? SkSurface::kDistanceField_TextRenderMode
                                 : SkSurface::kStandard_TextRenderMode;
-    resource->sk_surface = skia::AdoptRef(SkSurface::NewRenderTargetDirect(
+    resource_->sk_surface = skia::AdoptRef(SkSurface::NewRenderTargetDirect(
         gr_texture->asRenderTarget(), text_render_mode));
   }
-  return resource->sk_surface.get();
+  return resource_->sk_surface.get();
 }
 
 ResourceProvider::ResourceProvider(
     OutputSurface* output_surface,
     SharedBitmapManager* shared_bitmap_manager,
-    GpuMemoryBufferManager* gpu_memory_buffer_manager,
+    gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
     BlockingTaskRunner* blocking_main_thread_task_runner,
     int highp_threshold_min,
     bool use_rgba_4444_texture_format,
@@ -1907,7 +1877,7 @@
   }
 
   resource->pending_set_pixels = false;
-  UnlockForWrite(id);
+  UnlockForWrite(resource);
 
   // Async set pixels commands are not necessarily processed in-sequence with
   // drawing commands. Read lock fences are required to ensure that async
diff --git a/cc/resources/resource_provider.h b/cc/resources/resource_provider.h
index 2e2fecb..5c69b0c 100644
--- a/cc/resources/resource_provider.h
+++ b/cc/resources/resource_provider.h
@@ -36,6 +36,7 @@
 class GrContext;
 
 namespace gpu {
+class GpuMemoryBufferManager;
 namespace gles {
 class GLES2Interface;
 }
@@ -49,7 +50,6 @@
 
 namespace cc {
 class BlockingTaskRunner;
-class GpuMemoryBufferManager;
 class IdAllocator;
 class SharedBitmap;
 class SharedBitmapManager;
@@ -58,6 +58,9 @@
 // This class is not thread-safe and can only be called from the thread it was
 // created on (in practice, the impl thread).
 class CC_EXPORT ResourceProvider {
+ private:
+  struct Resource;
+
  public:
   typedef unsigned ResourceId;
   typedef std::vector<ResourceId> ResourceIdArray;
@@ -79,7 +82,7 @@
   static scoped_ptr<ResourceProvider> Create(
       OutputSurface* output_surface,
       SharedBitmapManager* shared_bitmap_manager,
-      GpuMemoryBufferManager* gpu_memory_buffer_manager,
+      gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
       BlockingTaskRunner* blocking_main_thread_task_runner,
       int highp_threshold_min,
       bool use_rgba_4444_texture_format,
@@ -258,7 +261,7 @@
 
    private:
     ResourceProvider* resource_provider_;
-    ResourceProvider::ResourceId resource_id_;
+    ResourceProvider::Resource* resource_;
     unsigned texture_id_;
 
     DISALLOW_COPY_AND_ASSIGN(ScopedWriteLockGL);
@@ -298,7 +301,7 @@
 
    private:
     ResourceProvider* resource_provider_;
-    ResourceProvider::ResourceId resource_id_;
+    ResourceProvider::Resource* resource_;
     SkBitmap sk_bitmap_;
     scoped_ptr<SkCanvas> sk_canvas_;
 
@@ -311,12 +314,15 @@
                                    ResourceProvider::ResourceId resource_id);
     ~ScopedWriteLockGpuMemoryBuffer();
 
-    gfx::GpuMemoryBuffer* gpu_memory_buffer() { return gpu_memory_buffer_; }
+    gfx::GpuMemoryBuffer* GetGpuMemoryBuffer();
 
    private:
     ResourceProvider* resource_provider_;
-    ResourceProvider::ResourceId resource_id_;
+    ResourceProvider::Resource* resource_;
+    gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager_;
     gfx::GpuMemoryBuffer* gpu_memory_buffer_;
+    gfx::Size size_;
+    ResourceFormat format_;
 
     DISALLOW_COPY_AND_ASSIGN(ScopedWriteLockGpuMemoryBuffer);
   };
@@ -331,7 +337,7 @@
 
    private:
     ResourceProvider* resource_provider_;
-    ResourceProvider::ResourceId resource_id_;
+    ResourceProvider::Resource* resource_;
 
     DISALLOW_COPY_AND_ASSIGN(ScopedWriteLockGr);
   };
@@ -482,7 +488,7 @@
 
   ResourceProvider(OutputSurface* output_surface,
                    SharedBitmapManager* shared_bitmap_manager,
-                   GpuMemoryBufferManager* gpu_memory_buffer_manager,
+                   gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
                    BlockingTaskRunner* blocking_main_thread_task_runner,
                    int highp_threshold_min,
                    bool use_rgba_4444_texture_format,
@@ -493,12 +499,8 @@
   Resource* GetResource(ResourceId id);
   const Resource* LockForRead(ResourceId id);
   void UnlockForRead(ResourceId id);
-  const Resource* LockForWrite(ResourceId id);
-  void UnlockForWrite(ResourceId id);
-  const Resource* LockForWriteToGpuMemoryBuffer(ResourceId id);
-  void UnlockForWriteToGpuMemoryBuffer(ResourceId id);
-  void LockForWriteToSkSurface(ResourceId id);
-  void UnlockForWriteToSkSurface(ResourceId id);
+  Resource* LockForWrite(ResourceId id);
+  void UnlockForWrite(Resource* resource);
 
   static void PopulateSkBitmapWithResource(SkBitmap* sk_bitmap,
                                            const Resource* resource);
@@ -530,7 +532,7 @@
 
   OutputSurface* output_surface_;
   SharedBitmapManager* shared_bitmap_manager_;
-  GpuMemoryBufferManager* gpu_memory_buffer_manager_;
+  gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager_;
   BlockingTaskRunner* blocking_main_thread_task_runner_;
   bool lost_output_surface_;
   int highp_threshold_min_;
diff --git a/cc/resources/resource_provider_unittest.cc b/cc/resources/resource_provider_unittest.cc
index 4efe74d..e507ad6 100644
--- a/cc/resources/resource_provider_unittest.cc
+++ b/cc/resources/resource_provider_unittest.cc
@@ -637,7 +637,7 @@
   {
     ResourceProvider::ScopedWriteLockGpuMemoryBuffer lock(
         child_resource_provider_.get(), id3);
-    EXPECT_TRUE(!!lock.gpu_memory_buffer());
+    EXPECT_TRUE(!!lock.GetGpuMemoryBuffer());
   }
 
   GLuint external_texture_id = child_context_->createExternalTexture();
@@ -3318,7 +3318,7 @@
   {
     ResourceProvider::ScopedWriteLockGpuMemoryBuffer lock(
         resource_provider.get(), id);
-    EXPECT_TRUE(!!lock.gpu_memory_buffer());
+    EXPECT_TRUE(!!lock.GetGpuMemoryBuffer());
   }
 
   EXPECT_CALL(*context, NextTextureId())
@@ -3339,7 +3339,7 @@
   {
     ResourceProvider::ScopedWriteLockGpuMemoryBuffer lock(
         resource_provider.get(), id);
-    EXPECT_TRUE(!!lock.gpu_memory_buffer());
+    EXPECT_TRUE(!!lock.GetGpuMemoryBuffer());
   }
 
   EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, kTextureId)).Times(1)
@@ -3405,7 +3405,7 @@
   {
     ResourceProvider::ScopedWriteLockGpuMemoryBuffer lock(
         resource_provider.get(), source_id);
-    EXPECT_TRUE(!!lock.gpu_memory_buffer());
+    EXPECT_TRUE(!!lock.GetGpuMemoryBuffer());
   }
   Mock::VerifyAndClearExpectations(context);
 
diff --git a/cc/resources/tile.cc b/cc/resources/tile.cc
index e994a5e..d6bd3c4 100644
--- a/cc/resources/tile.cc
+++ b/cc/resources/tile.cc
@@ -17,7 +17,7 @@
 Tile::Id Tile::s_next_id_ = 0;
 
 Tile::Tile(TileManager* tile_manager,
-           PicturePileImpl* picture_pile,
+           RasterSource* raster_source,
            const gfx::Size& tile_size,
            const gfx::Rect& content_rect,
            float contents_scale,
@@ -37,7 +37,7 @@
       tiling_j_index_(-1),
       required_for_activation_(false),
       id_(s_next_id_++) {
-  set_picture_pile(picture_pile);
+  set_raster_source(raster_source);
   for (int i = 0; i < NUM_TREES; i++)
     is_occluded_[i] = false;
 }
@@ -51,7 +51,7 @@
 void Tile::AsValueInto(base::debug::TracedValue* res) const {
   TracedValue::MakeDictIntoImplicitSnapshotWithCategory(
       TRACE_DISABLED_BY_DEFAULT("cc.debug"), res, "cc::Tile", this);
-  TracedValue::SetIDRef(picture_pile_.get(), res, "picture_pile");
+  TracedValue::SetIDRef(raster_source_.get(), res, "picture_pile");
   res->SetDouble("contents_scale", contents_scale_);
 
   res->BeginArray("content_rect");
diff --git a/cc/resources/tile.h b/cc/resources/tile.h
index a712a75..c641367 100644
--- a/cc/resources/tile.h
+++ b/cc/resources/tile.h
@@ -8,7 +8,7 @@
 #include "base/memory/ref_counted.h"
 #include "cc/base/ref_counted_managed.h"
 #include "cc/resources/managed_tile_state.h"
-#include "cc/resources/picture_pile_impl.h"
+#include "cc/resources/raster_source.h"
 #include "cc/resources/tile_priority.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/geometry/size.h"
@@ -25,13 +25,9 @@
     return id_;
   }
 
-  PicturePileImpl* picture_pile() {
-    return picture_pile_.get();
-  }
+  RasterSource* raster_source() { return raster_source_.get(); }
 
-  const PicturePileImpl* picture_pile() const {
-    return picture_pile_.get();
-  }
+  const RasterSource* raster_source() const { return raster_source_.get(); }
 
   const TilePriority& priority(WhichTree tree) const {
     return priority_[tree];
@@ -120,12 +116,12 @@
 
   int source_frame_number() const { return source_frame_number_; }
 
-  void set_picture_pile(scoped_refptr<PicturePileImpl> pile) {
-    DCHECK(pile->CanRaster(contents_scale_, content_rect_))
+  void set_raster_source(scoped_refptr<RasterSource> raster_source) {
+    DCHECK(raster_source->CoversRect(content_rect_, contents_scale_))
         << "Recording rect: "
         << gfx::ScaleToEnclosingRect(content_rect_, 1.f / contents_scale_)
                .ToString();
-    picture_pile_ = pile;
+    raster_source_ = raster_source;
   }
 
   size_t GPUMemoryUsageInBytes() const;
@@ -148,7 +144,7 @@
 
   // Methods called by by tile manager.
   Tile(TileManager* tile_manager,
-       PicturePileImpl* picture_pile,
+       RasterSource* raster_source,
        const gfx::Size& tile_size,
        const gfx::Rect& content_rect,
        float contents_scale,
@@ -163,7 +159,7 @@
   bool HasRasterTask() const;
 
   TileManager* tile_manager_;
-  scoped_refptr<PicturePileImpl> picture_pile_;
+  scoped_refptr<RasterSource> raster_source_;
   gfx::Size size_;
   gfx::Rect content_rect_;
   float contents_scale_;
diff --git a/cc/resources/tile_manager.cc b/cc/resources/tile_manager.cc
index 77c4df6..86874e7 100644
--- a/cc/resources/tile_manager.cc
+++ b/cc/resources/tile_manager.cc
@@ -33,7 +33,7 @@
  public:
   RasterTaskImpl(
       const Resource* resource,
-      PicturePileImpl* picture_pile,
+      RasterSource* raster_source,
       const gfx::Rect& content_rect,
       float contents_scale,
       TileResolution tile_resolution,
@@ -42,10 +42,11 @@
       int source_frame_number,
       bool analyze_picture,
       RenderingStatsInstrumentation* rendering_stats,
-      const base::Callback<void(const PicturePileImpl::Analysis&, bool)>& reply,
+      const base::Callback<void(const RasterSource::SolidColorAnalysis&, bool)>&
+          reply,
       ImageDecodeTask::Vector* dependencies)
       : RasterTask(resource, dependencies),
-        picture_pile_(picture_pile),
+        raster_source_(raster_source),
         content_rect_(content_rect),
         contents_scale_(contents_scale),
         tile_resolution_(tile_resolution),
@@ -60,16 +61,16 @@
   void RunOnWorkerThread() override {
     TRACE_EVENT0("cc", "RasterizerTaskImpl::RunOnWorkerThread");
 
-    DCHECK(picture_pile_.get());
+    DCHECK(raster_source_.get());
     DCHECK(raster_buffer_);
 
     if (analyze_picture_) {
-      Analyze(picture_pile_.get());
+      Analyze(raster_source_.get());
       if (analysis_.is_solid_color)
         return;
     }
 
-    Raster(picture_pile_.get());
+    Raster(raster_source_.get());
   }
 
   // Overridden from RasterizerTask:
@@ -89,13 +90,13 @@
   ~RasterTaskImpl() override { DCHECK(!raster_buffer_); }
 
  private:
-  void Analyze(const PicturePileImpl* picture_pile) {
+  void Analyze(const RasterSource* raster_source) {
     frame_viewer_instrumentation::ScopedAnalyzeTask analyze_task(
         tile_id_, tile_resolution_, source_frame_number_, layer_id_);
 
-    DCHECK(picture_pile);
+    DCHECK(raster_source);
 
-    picture_pile->AnalyzeInRect(
+    raster_source->PerformSolidColorAnalysis(
         content_rect_, contents_scale_, &analysis_, rendering_stats_);
 
     // Record the solid color prediction.
@@ -106,7 +107,7 @@
     analysis_.is_solid_color &= kUseColorEstimator;
   }
 
-  void Raster(const PicturePileImpl* picture_pile) {
+  void Raster(const RasterSource* raster_source) {
     frame_viewer_instrumentation::ScopedRasterTask raster_task(
         tile_id_, tile_resolution_, source_frame_number_, layer_id_);
     devtools_instrumentation::ScopedLayerTask layer_task(
@@ -121,10 +122,10 @@
     // before we draw and sometimes they aren't)
     RenderingStatsInstrumentation* stats =
         tile_resolution_ == HIGH_RESOLUTION ? rendering_stats_ : NULL;
-    DCHECK(picture_pile);
+    DCHECK(raster_source);
 
     raster_buffer_->Playback(
-        picture_pile_.get(), content_rect_, contents_scale_, stats);
+        raster_source_.get(), content_rect_, contents_scale_, stats);
 
     if (rendering_stats_->record_rendering_stats()) {
       base::TimeDelta current_rasterize_time =
@@ -138,8 +139,8 @@
     }
   }
 
-  PicturePileImpl::Analysis analysis_;
-  scoped_refptr<PicturePileImpl> picture_pile_;
+  RasterSource::SolidColorAnalysis analysis_;
+  scoped_refptr<RasterSource> raster_source_;
   gfx::Rect content_rect_;
   float contents_scale_;
   TileResolution tile_resolution_;
@@ -148,7 +149,8 @@
   int source_frame_number_;
   bool analyze_picture_;
   RenderingStatsInstrumentation* rendering_stats_;
-  const base::Callback<void(const PicturePileImpl::Analysis&, bool)> reply_;
+  const base::Callback<void(const RasterSource::SolidColorAnalysis&, bool)>
+      reply_;
   scoped_ptr<RasterBuffer> raster_buffer_;
 
   DISALLOW_COPY_AND_ASSIGN(RasterTaskImpl);
@@ -733,11 +735,10 @@
   // Create and queue all image decode tasks that this tile depends on.
   ImageDecodeTask::Vector decode_tasks;
   PixelRefTaskMap& existing_pixel_refs = image_decode_tasks_[tile->layer_id()];
-  for (PicturePileImpl::PixelRefIterator iter(
-           tile->content_rect(), tile->contents_scale(), tile->picture_pile());
-       iter;
-       ++iter) {
-    SkPixelRef* pixel_ref = *iter;
+  std::vector<SkPixelRef*> pixel_refs;
+  tile->raster_source()->GatherPixelRefs(
+      tile->content_rect(), tile->contents_scale(), &pixel_refs);
+  for (SkPixelRef* pixel_ref : pixel_refs) {
     uint32_t id = pixel_ref->getGenerationID();
 
     // Append existing image decode task if available.
@@ -756,7 +757,7 @@
 
   return make_scoped_refptr(
       new RasterTaskImpl(const_resource,
-                         tile->picture_pile(),
+                         tile->raster_source(),
                          tile->content_rect(),
                          tile->contents_scale(),
                          mts.resolution,
@@ -795,7 +796,7 @@
 void TileManager::OnRasterTaskCompleted(
     Tile::Id tile_id,
     scoped_ptr<ScopedResource> resource,
-    const PicturePileImpl::Analysis& analysis,
+    const RasterSource::SolidColorAnalysis& analysis,
     bool was_canceled) {
   DCHECK(tiles_.find(tile_id) != tiles_.end());
 
@@ -827,7 +828,7 @@
   client_->NotifyTileStateChanged(tile);
 }
 
-scoped_refptr<Tile> TileManager::CreateTile(PicturePileImpl* picture_pile,
+scoped_refptr<Tile> TileManager::CreateTile(RasterSource* raster_source,
                                             const gfx::Size& tile_size,
                                             const gfx::Rect& content_rect,
                                             float contents_scale,
@@ -835,7 +836,7 @@
                                             int source_frame_number,
                                             int flags) {
   scoped_refptr<Tile> tile = make_scoped_refptr(new Tile(this,
-                                                         picture_pile,
+                                                         raster_source,
                                                          tile_size,
                                                          content_rect,
                                                          contents_scale,
diff --git a/cc/resources/tile_manager.h b/cc/resources/tile_manager.h
index 6f579f9..f5bea38 100644
--- a/cc/resources/tile_manager.h
+++ b/cc/resources/tile_manager.h
@@ -20,7 +20,7 @@
 #include "cc/resources/eviction_tile_priority_queue.h"
 #include "cc/resources/managed_tile_state.h"
 #include "cc/resources/memory_history.h"
-#include "cc/resources/picture_pile_impl.h"
+#include "cc/resources/raster_source.h"
 #include "cc/resources/raster_tile_priority_queue.h"
 #include "cc/resources/rasterizer.h"
 #include "cc/resources/resource_pool.h"
@@ -107,7 +107,7 @@
   // Returns true when visible tiles have been initialized.
   bool UpdateVisibleTiles();
 
-  scoped_refptr<Tile> CreateTile(PicturePileImpl* picture_pile,
+  scoped_refptr<Tile> CreateTile(RasterSource* raster_source,
                                  const gfx::Size& tile_size,
                                  const gfx::Rect& content_rect,
                                  float contents_scale,
@@ -213,7 +213,7 @@
                                   bool was_canceled);
   void OnRasterTaskCompleted(Tile::Id tile,
                              scoped_ptr<ScopedResource> resource,
-                             const PicturePileImpl::Analysis& analysis,
+                             const RasterSource::SolidColorAnalysis& analysis,
                              bool was_canceled);
 
   void FreeResourcesForTile(Tile* tile);
diff --git a/cc/resources/tile_manager_unittest.cc b/cc/resources/tile_manager_unittest.cc
index 398474b..2f0735c 100644
--- a/cc/resources/tile_manager_unittest.cc
+++ b/cc/resources/tile_manager_unittest.cc
@@ -100,12 +100,23 @@
   void SetupPendingTree(scoped_refptr<PicturePileImpl> pile) {
     host_impl_.CreatePendingTree();
     LayerTreeImpl* pending_tree = host_impl_.pending_tree();
-    // Clear recycled tree.
-    pending_tree->DetachLayerTree();
 
-    scoped_ptr<FakePictureLayerImpl> pending_layer =
-        FakePictureLayerImpl::CreateWithPile(pending_tree, id_, pile);
-    pending_layer->SetDrawsContent(true);
+    // Steal from the recycled tree.
+    scoped_ptr<LayerImpl> old_pending_root = pending_tree->DetachLayerTree();
+    DCHECK_IMPLIES(old_pending_root, old_pending_root->id() == id_);
+
+    scoped_ptr<FakePictureLayerImpl> pending_layer;
+    if (old_pending_root) {
+      pending_layer.reset(
+          static_cast<FakePictureLayerImpl*>(old_pending_root.release()));
+      pending_layer->SetPile(pile);
+    } else {
+      pending_layer =
+          FakePictureLayerImpl::CreateWithPile(pending_tree, id_, pile);
+      pending_layer->SetDrawsContent(true);
+    }
+    // The bounds() just mirror the pile size.
+    pending_layer->SetBounds(pending_layer->pile()->tiling_size());
     pending_tree->SetRootLayer(pending_layer.Pass());
 
     pending_layer_ = static_cast<FakePictureLayerImpl*>(
diff --git a/cc/resources/zero_copy_raster_worker_pool.cc b/cc/resources/zero_copy_raster_worker_pool.cc
index 10464cd..4030942 100644
--- a/cc/resources/zero_copy_raster_worker_pool.cc
+++ b/cc/resources/zero_copy_raster_worker_pool.cc
@@ -24,11 +24,11 @@
       : lock_(resource_provider, resource->id()), resource_(resource) {}
 
   // Overridden from RasterBuffer:
-  void Playback(const PicturePileImpl* picture_pile,
+  void Playback(const RasterSource* raster_source,
                 const gfx::Rect& rect,
                 float scale,
                 RenderingStatsInstrumentation* stats) override {
-    gfx::GpuMemoryBuffer* gpu_memory_buffer = lock_.gpu_memory_buffer();
+    gfx::GpuMemoryBuffer* gpu_memory_buffer = lock_.GetGpuMemoryBuffer();
     if (!gpu_memory_buffer)
       return;
 
@@ -36,7 +36,7 @@
                                        resource_->format(),
                                        resource_->size(),
                                        gpu_memory_buffer->GetStride(),
-                                       picture_pile,
+                                       raster_source,
                                        rect,
                                        scale,
                                        stats);
diff --git a/cc/scheduler/scheduler_state_machine.cc b/cc/scheduler/scheduler_state_machine.cc
index 6a412dc..2b8210d 100644
--- a/cc/scheduler/scheduler_state_machine.cc
+++ b/cc/scheduler/scheduler_state_machine.cc
@@ -43,6 +43,7 @@
       has_pending_tree_(false),
       pending_tree_is_ready_for_activation_(false),
       active_tree_needs_first_draw_(false),
+      did_commit_after_animating_(false),
       did_create_and_initialize_first_output_surface_(false),
       impl_latency_takes_priority_(false),
       skip_next_begin_main_frame_to_reduce_latency_(false),
@@ -226,6 +227,7 @@
                     pending_tree_is_ready_for_activation_);
   state->SetBoolean("active_tree_needs_first_draw",
                     active_tree_needs_first_draw_);
+  state->SetBoolean("did_commit_after_animating", did_commit_after_animating_);
   state->SetBoolean("did_create_and_initialize_first_output_surface",
                     did_create_and_initialize_first_output_surface_);
   state->SetBoolean("impl_latency_takes_priority",
@@ -254,6 +256,10 @@
   skip_next_begin_main_frame_to_reduce_latency_ = false;
 }
 
+bool SchedulerStateMachine::HasAnimatedThisFrame() const {
+  return last_frame_number_animate_performed_ == current_frame_number_;
+}
+
 bool SchedulerStateMachine::HasSentBeginMainFrameThisFrame() const {
   return current_frame_number_ ==
          last_frame_number_begin_main_frame_sent_;
@@ -344,6 +350,11 @@
   if (PendingDrawsShouldBeAborted())
     return active_tree_needs_first_draw_;
 
+  // If a commit has occurred after the animate call, we need to call animate
+  // again before we should draw.
+  if (did_commit_after_animating_)
+    return false;
+
   // After this line, we only want to send a swap request once per frame.
   if (HasRequestedSwapThisFrame())
     return false;
@@ -415,7 +426,8 @@
   if (!can_draw_)
     return false;
 
-  if (last_frame_number_animate_performed_ == current_frame_number_)
+  // If a commit occurred after our last call, we need to do animation again.
+  if (HasAnimatedThisFrame() && !did_commit_after_animating_)
     return false;
 
   if (begin_impl_frame_state_ != BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING &&
@@ -567,6 +579,7 @@
     case ACTION_ANIMATE:
       last_frame_number_animate_performed_ = current_frame_number_;
       needs_animate_ = false;
+      did_commit_after_animating_ = false;
       // TODO(skyostil): Instead of assuming this, require the client to tell
       // us.
       SetNeedsRedraw();
@@ -622,6 +635,9 @@
 void SchedulerStateMachine::UpdateStateOnCommit(bool commit_was_aborted) {
   commit_count_++;
 
+  if (!commit_was_aborted && HasAnimatedThisFrame())
+    did_commit_after_animating_ = true;
+
   if (commit_was_aborted || settings_.main_frame_before_activation_enabled) {
     commit_state_ = COMMIT_STATE_IDLE;
   } else {
diff --git a/cc/scheduler/scheduler_state_machine.h b/cc/scheduler/scheduler_state_machine.h
index 0bcb323..a63a683 100644
--- a/cc/scheduler/scheduler_state_machine.h
+++ b/cc/scheduler/scheduler_state_machine.h
@@ -266,6 +266,7 @@
   bool ShouldManageTiles() const;
 
   void AdvanceCurrentFrameNumber();
+  bool HasAnimatedThisFrame() const;
   bool HasSentBeginMainFrameThisFrame() const;
   bool HasUpdatedVisibleTilesThisFrame() const;
   bool HasRequestedSwapThisFrame() const;
@@ -313,6 +314,7 @@
   bool has_pending_tree_;
   bool pending_tree_is_ready_for_activation_;
   bool active_tree_needs_first_draw_;
+  bool did_commit_after_animating_;
   bool did_create_and_initialize_first_output_surface_;
   bool impl_latency_takes_priority_;
   bool skip_next_begin_main_frame_to_reduce_latency_;
diff --git a/cc/scheduler/scheduler_state_machine_unittest.cc b/cc/scheduler/scheduler_state_machine_unittest.cc
index fc82fb6..e3530c8 100644
--- a/cc/scheduler/scheduler_state_machine_unittest.cc
+++ b/cc/scheduler/scheduler_state_machine_unittest.cc
@@ -1761,6 +1761,39 @@
       SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
 }
 
+TEST(SchedulerStateMachineTest, TestAnimateAfterCommitBeforeDraw) {
+  SchedulerSettings settings;
+  settings.impl_side_painting = true;
+  StateMachine state(settings);
+  state.SetCanStart();
+  state.UpdateState(state.NextAction());
+  state.CreateAndInitializeOutputSurfaceWithActivatedCommit();
+  state.SetVisible(true);
+  state.SetCanDraw(true);
+
+  // Check that animations are updated before we start a commit.
+  state.SetNeedsAnimate();
+  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+  state.SetNeedsCommit();
+  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+  EXPECT_TRUE(state.BeginFrameNeeded());
+
+  state.OnBeginImplFrame(CreateBeginFrameArgsForTesting());
+  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
+  EXPECT_ACTION_UPDATE_STATE(
+      SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
+
+  state.NotifyBeginMainFrameStarted();
+  state.NotifyReadyToCommit();
+  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
+
+  state.OnBeginImplFrameDeadlinePending();
+  state.OnBeginImplFrameDeadline();
+  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
+  EXPECT_ACTION_UPDATE_STATE(
+      SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
+}
+
 TEST(SchedulerStateMachineTest, TestSetNeedsAnimateAfterAnimate) {
   SchedulerSettings settings;
   settings.impl_side_painting = true;
diff --git a/cc/surfaces/BUILD.gn b/cc/surfaces/BUILD.gn
index 46fdfc1..a45e786 100644
--- a/cc/surfaces/BUILD.gn
+++ b/cc/surfaces/BUILD.gn
@@ -32,6 +32,7 @@
     "//base/third_party/dynamic_annotations",
     "//cc",
     "//skia",
+    "//ui/events:events_base",
     "//ui/gfx",
     "//ui/gfx/geometry",
   ]
diff --git a/cc/surfaces/display.cc b/cc/surfaces/display.cc
index 29b0f8e..f50e87c 100644
--- a/cc/surfaces/display.cc
+++ b/cc/surfaces/display.cc
@@ -24,7 +24,7 @@
 Display::Display(DisplayClient* client,
                  SurfaceManager* manager,
                  SharedBitmapManager* bitmap_manager,
-                 GpuMemoryBufferManager* gpu_memory_buffer_manager)
+                 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager)
     : client_(client),
       manager_(manager),
       bitmap_manager_(bitmap_manager),
diff --git a/cc/surfaces/display.h b/cc/surfaces/display.h
index 94202c5..2346a40 100644
--- a/cc/surfaces/display.h
+++ b/cc/surfaces/display.h
@@ -42,7 +42,7 @@
   Display(DisplayClient* client,
           SurfaceManager* manager,
           SharedBitmapManager* bitmap_manager,
-          GpuMemoryBufferManager* gpu_memory_buffer_manager);
+          gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager);
   ~Display() override;
 
   bool Initialize(scoped_ptr<OutputSurface> output_surface);
@@ -85,7 +85,7 @@
   DisplayClient* client_;
   SurfaceManager* manager_;
   SharedBitmapManager* bitmap_manager_;
-  GpuMemoryBufferManager* gpu_memory_buffer_manager_;
+  gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager_;
   SurfaceId current_surface_id_;
   gfx::Size current_surface_size_;
   LayerTreeSettings settings_;
diff --git a/cc/surfaces/surface_aggregator.cc b/cc/surfaces/surface_aggregator.cc
index e3574e5..ae0fce0 100644
--- a/cc/surfaces/surface_aggregator.cc
+++ b/cc/surfaces/surface_aggregator.cc
@@ -91,8 +91,8 @@
   SurfaceToResourceChildIdMap::iterator it =
       surface_id_to_resource_child_id_.find(surface->surface_id());
   if (it == surface_id_to_resource_child_id_.end()) {
-    int child_id = provider_->CreateChild(
-        base::Bind(&UnrefHelper, surface->factory()->AsWeakPtr()));
+    int child_id =
+        provider_->CreateChild(base::Bind(&UnrefHelper, surface->factory()));
     surface_id_to_resource_child_id_[surface->surface_id()] = child_id;
     return child_id;
   } else {
@@ -127,7 +127,8 @@
 
   int child_id = ChildIdForSurface(surface);
   provider_->ReceiveFromChild(child_id, frame_data->resource_list);
-  surface->factory()->RefResources(frame_data->resource_list);
+  if (surface->factory())
+    surface->factory()->RefResources(frame_data->resource_list);
 
   typedef ResourceProvider::ResourceIdArray IdArray;
   IdArray referenced_resources;
diff --git a/cc/test/data/blue_yellow_flipped.png b/cc/test/data/blue_yellow_flipped.png
new file mode 100644
index 0000000..04d17b6
--- /dev/null
+++ b/cc/test/data/blue_yellow_flipped.png
Binary files differ
diff --git a/cc/test/fake_picture_layer_impl.cc b/cc/test/fake_picture_layer_impl.cc
index 8082685..73c1ae3 100644
--- a/cc/test/fake_picture_layer_impl.cc
+++ b/cc/test/fake_picture_layer_impl.cc
@@ -97,6 +97,16 @@
   return result;
 }
 
+void FakePictureLayerImpl::SetPile(scoped_refptr<PicturePileImpl> pile) {
+  pile_.swap(pile);
+  if (tilings()) {
+    for (size_t i = 0; i < num_tilings(); ++i) {
+      tilings()->tiling_at(i)->UpdateTilesToCurrentPile(Region(),
+                                                        pile_->tiling_size());
+    }
+  }
+}
+
 void FakePictureLayerImpl::SetAllTilesVisible() {
   WhichTree tree =
       layer_tree_impl()->IsActiveTree() ? ACTIVE_TREE : PENDING_TREE;
diff --git a/cc/test/fake_picture_layer_impl.h b/cc/test/fake_picture_layer_impl.h
index ef554b3..a3c69c5 100644
--- a/cc/test/fake_picture_layer_impl.h
+++ b/cc/test/fake_picture_layer_impl.h
@@ -80,10 +80,9 @@
   PictureLayerTiling* LowResTiling() const;
   size_t num_tilings() const { return tilings_->num_tilings(); }
 
-  PictureLayerImpl* twin_layer() { return twin_layer_; }
-  void set_twin_layer(PictureLayerImpl* twin) { twin_layer_ = twin; }
   PictureLayerTilingSet* tilings() { return tilings_.get(); }
   PicturePileImpl* pile() { return pile_.get(); }
+  void SetPile(scoped_refptr<PicturePileImpl> pile);
   size_t append_quads_count() { return append_quads_count_; }
 
   const Region& invalidation() const { return invalidation_; }
diff --git a/cc/test/fake_picture_layer_tiling_client.cc b/cc/test/fake_picture_layer_tiling_client.cc
index ce46c91..2149ff4 100644
--- a/cc/test/fake_picture_layer_tiling_client.cc
+++ b/cc/test/fake_picture_layer_tiling_client.cc
@@ -47,7 +47,7 @@
   return tile_manager_->CreateTile(pile_.get(), tile_size_, rect, 1, 0, 0, 0);
 }
 
-PicturePileImpl* FakePictureLayerTilingClient::GetPile() {
+RasterSource* FakePictureLayerTilingClient::GetRasterSource() {
   return pile_.get();
 }
 
@@ -73,12 +73,13 @@
   return skewport_extrapolation_limit_in_content_pixels_;
 }
 
-const Region* FakePictureLayerTilingClient::GetInvalidation() {
+const Region* FakePictureLayerTilingClient::GetPendingInvalidation() {
   return &invalidation_;
 }
 
-const PictureLayerTiling* FakePictureLayerTilingClient::GetTwinTiling(
-      const PictureLayerTiling* tiling) const {
+const PictureLayerTiling*
+FakePictureLayerTilingClient::GetPendingOrActiveTwinTiling(
+    const PictureLayerTiling* tiling) const {
   return twin_tiling_;
 }
 
diff --git a/cc/test/fake_picture_layer_tiling_client.h b/cc/test/fake_picture_layer_tiling_client.h
index 0e2f645..3df4ca4 100644
--- a/cc/test/fake_picture_layer_tiling_client.h
+++ b/cc/test/fake_picture_layer_tiling_client.h
@@ -23,7 +23,7 @@
   // PictureLayerTilingClient implementation.
   scoped_refptr<Tile> CreateTile(PictureLayerTiling* tiling,
                                  const gfx::Rect& rect) override;
-  PicturePileImpl* GetPile() override;
+  RasterSource* GetRasterSource() override;
   gfx::Size CalculateTileSize(const gfx::Size& content_bounds) const override;
   size_t GetMaxTilesForInterestArea() const override;
   float GetSkewportTargetTimeInSeconds() const override;
@@ -33,8 +33,8 @@
   void SetTileSize(const gfx::Size& tile_size);
   gfx::Size TileSize() const { return tile_size_; }
 
-  const Region* GetInvalidation() override;
-  const PictureLayerTiling* GetTwinTiling(
+  const Region* GetPendingInvalidation() override;
+  const PictureLayerTiling* GetPendingOrActiveTwinTiling(
       const PictureLayerTiling* tiling) const override;
   PictureLayerTiling* GetRecycledTwinTiling(
       const PictureLayerTiling* tiling) override;
diff --git a/cc/test/fake_picture_pile_impl.h b/cc/test/fake_picture_pile_impl.h
index 2d495f4..10c769a 100644
--- a/cc/test/fake_picture_pile_impl.h
+++ b/cc/test/fake_picture_pile_impl.h
@@ -68,8 +68,6 @@
     clear_canvas_with_debug_color_ = clear;
   }
 
-  void set_has_text(bool has_text) { has_text_ = has_text; }
-
   void set_is_solid_color(bool is_solid_color) {
     is_solid_color_ = is_solid_color;
   }
diff --git a/cc/test/layer_tree_pixel_test.cc b/cc/test/layer_tree_pixel_test.cc
index 31d30a4..370995e 100644
--- a/cc/test/layer_tree_pixel_test.cc
+++ b/cc/test/layer_tree_pixel_test.cc
@@ -51,8 +51,9 @@
       break;
     }
     case PIXEL_TEST_GL: {
-      output_surface = make_scoped_ptr(
-          new PixelTestOutputSurface(new TestInProcessContextProvider));
+      bool flipped_output_surface = false;
+      output_surface = make_scoped_ptr(new PixelTestOutputSurface(
+          new TestInProcessContextProvider, flipped_output_surface));
       break;
     }
   }
diff --git a/cc/test/layer_tree_test.cc b/cc/test/layer_tree_test.cc
index 8be75bd..8c0255a 100644
--- a/cc/test/layer_tree_test.cc
+++ b/cc/test/layer_tree_test.cc
@@ -114,7 +114,7 @@
       LayerTreeHostImplClient* host_impl_client,
       Proxy* proxy,
       SharedBitmapManager* shared_bitmap_manager,
-      GpuMemoryBufferManager* gpu_memory_buffer_manager,
+      gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
       RenderingStatsInstrumentation* stats_instrumentation) {
     return make_scoped_ptr(
         new LayerTreeHostImplForTesting(test_hooks,
@@ -133,7 +133,7 @@
       LayerTreeHostImplClient* host_impl_client,
       Proxy* proxy,
       SharedBitmapManager* shared_bitmap_manager,
-      GpuMemoryBufferManager* gpu_memory_buffer_manager,
+      gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
       RenderingStatsInstrumentation* stats_instrumentation)
       : LayerTreeHostImpl(settings,
                           host_impl_client,
diff --git a/cc/test/pixel_test.cc b/cc/test/pixel_test.cc
index 1565b8a..3a9b45b 100644
--- a/cc/test/pixel_test.cc
+++ b/cc/test/pixel_test.cc
@@ -55,12 +55,26 @@
     RenderPass* target,
     const base::FilePath& ref_file,
     const PixelComparator& comparator) {
+  return RunPixelTestWithReadbackTargetAndArea(
+      pass_list, target, ref_file, comparator, nullptr);
+}
+
+bool PixelTest::RunPixelTestWithReadbackTargetAndArea(
+    RenderPassList* pass_list,
+    RenderPass* target,
+    const base::FilePath& ref_file,
+    const PixelComparator& comparator,
+    const gfx::Rect* copy_rect) {
   base::RunLoop run_loop;
 
-  target->copy_requests.push_back(CopyOutputRequest::CreateBitmapRequest(
-      base::Bind(&PixelTest::ReadbackResult,
-                 base::Unretained(this),
-                 run_loop.QuitClosure())));
+  scoped_ptr<CopyOutputRequest> request =
+      CopyOutputRequest::CreateBitmapRequest(
+          base::Bind(&PixelTest::ReadbackResult,
+                     base::Unretained(this),
+                     run_loop.QuitClosure()));
+  if (copy_rect)
+    request->set_area(*copy_rect);
+  target->copy_requests.push_back(request.Pass());
 
   float device_scale_factor = 1.f;
   gfx::Rect device_viewport_rect =
@@ -108,11 +122,12 @@
       *result_bitmap_, test_data_dir.Append(ref_file), comparator);
 }
 
-void PixelTest::SetUpGLRenderer(bool use_skia_gpu_backend) {
+void PixelTest::SetUpGLRenderer(bool use_skia_gpu_backend,
+                                bool flipped_output_surface) {
   enable_pixel_output_.reset(new gfx::DisableNullDrawGLBindings);
 
-  output_surface_.reset(
-      new PixelTestOutputSurface(new TestInProcessContextProvider));
+  output_surface_.reset(new PixelTestOutputSurface(
+      new TestInProcessContextProvider, flipped_output_surface));
   output_surface_->BindToClient(output_surface_client_.get());
 
   shared_bitmap_manager_.reset(new TestSharedBitmapManager);
diff --git a/cc/test/pixel_test.h b/cc/test/pixel_test.h
index 1a6c5ba..dff2790 100644
--- a/cc/test/pixel_test.h
+++ b/cc/test/pixel_test.h
@@ -39,6 +39,12 @@
       const base::FilePath& ref_file,
       const PixelComparator& comparator);
 
+  bool RunPixelTestWithReadbackTargetAndArea(RenderPassList* pass_list,
+                                             RenderPass* target,
+                                             const base::FilePath& ref_file,
+                                             const PixelComparator& comparator,
+                                             const gfx::Rect* copy_rect);
+
   LayerTreeSettings settings_;
   gfx::Size device_viewport_size_;
   bool disable_picture_quad_image_filtering_;
@@ -55,7 +61,7 @@
   gfx::Vector2d external_device_viewport_offset_;
   gfx::Rect external_device_clip_rect_;
 
-  void SetUpGLRenderer(bool use_skia_gpu_backend);
+  void SetUpGLRenderer(bool use_skia_gpu_backend, bool flipped_output_surface);
   void SetUpSoftwareRenderer();
 
   void ForceExpandedViewport(const gfx::Size& surface_expansion);
@@ -117,9 +123,25 @@
       : SoftwareRenderer(client, settings, output_surface, resource_provider) {}
 };
 
+class GLRendererWithFlippedSurface : public GLRenderer {
+ public:
+  GLRendererWithFlippedSurface(RendererClient* client,
+                               const LayerTreeSettings* settings,
+                               OutputSurface* output_surface,
+                               ResourceProvider* resource_provider,
+                               TextureMailboxDeleter* texture_mailbox_deleter,
+                               int highp_threshold_min)
+      : GLRenderer(client,
+                   settings,
+                   output_surface,
+                   resource_provider,
+                   texture_mailbox_deleter,
+                   highp_threshold_min) {}
+};
+
 template<>
 inline void RendererPixelTest<GLRenderer>::SetUp() {
-  SetUpGLRenderer(false);
+  SetUpGLRenderer(false, false);
 }
 
 template<>
@@ -134,7 +156,7 @@
 
 template<>
 inline void RendererPixelTest<GLRendererWithExpandedViewport>::SetUp() {
-  SetUpGLRenderer(false);
+  SetUpGLRenderer(false, false);
   ForceExpandedViewport(gfx::Size(50, 50));
   ForceViewportOffset(gfx::Vector2d(10, 20));
 }
@@ -151,7 +173,24 @@
   return true;
 }
 
-template<>
+template <>
+inline void RendererPixelTest<GLRendererWithFlippedSurface>::SetUp() {
+  SetUpGLRenderer(false, true);
+}
+
+template <>
+inline bool RendererPixelTest<GLRendererWithFlippedSurface>::UseSkiaGPUBackend()
+    const {
+  return false;
+}
+
+template <>
+inline bool RendererPixelTest<GLRendererWithFlippedSurface>::ExpandedViewport()
+    const {
+  return true;
+}
+
+template <>
 inline void RendererPixelTest<SoftwareRenderer>::SetUp() {
   SetUpSoftwareRenderer();
 }
diff --git a/cc/test/pixel_test_output_surface.cc b/cc/test/pixel_test_output_surface.cc
index 640c118..ced1898 100644
--- a/cc/test/pixel_test_output_surface.cc
+++ b/cc/test/pixel_test_output_surface.cc
@@ -10,8 +10,11 @@
 namespace cc {
 
 PixelTestOutputSurface::PixelTestOutputSurface(
-    scoped_refptr<ContextProvider> context_provider)
-    : OutputSurface(context_provider), external_stencil_test_(false) {}
+    scoped_refptr<ContextProvider> context_provider,
+    bool flipped_output_surface)
+    : OutputSurface(context_provider), external_stencil_test_(false) {
+  capabilities_.flipped_output_surface = flipped_output_surface;
+}
 
 PixelTestOutputSurface::PixelTestOutputSurface(
     scoped_ptr<SoftwareOutputDevice> software_device)
diff --git a/cc/test/pixel_test_output_surface.h b/cc/test/pixel_test_output_surface.h
index 7c725f0..a58e2c4 100644
--- a/cc/test/pixel_test_output_surface.h
+++ b/cc/test/pixel_test_output_surface.h
@@ -12,7 +12,8 @@
 class PixelTestOutputSurface : public OutputSurface {
  public:
   explicit PixelTestOutputSurface(
-      scoped_refptr<ContextProvider> context_provider);
+      scoped_refptr<ContextProvider> context_provider,
+      bool flipped_output_surface);
   explicit PixelTestOutputSurface(
       scoped_ptr<SoftwareOutputDevice> software_device);
 
diff --git a/cc/test/test_gpu_memory_buffer_manager.h b/cc/test/test_gpu_memory_buffer_manager.h
index 267e6fe..fd1c66a 100644
--- a/cc/test/test_gpu_memory_buffer_manager.h
+++ b/cc/test/test_gpu_memory_buffer_manager.h
@@ -5,16 +5,16 @@
 #ifndef CC_TEST_TEST_GPU_MEMORY_BUFFER_MANAGER_H_
 #define CC_TEST_TEST_GPU_MEMORY_BUFFER_MANAGER_H_
 
-#include "cc/resources/gpu_memory_buffer_manager.h"
+#include "gpu/command_buffer/client/gpu_memory_buffer_manager.h"
 
 namespace cc {
 
-class TestGpuMemoryBufferManager : public GpuMemoryBufferManager {
+class TestGpuMemoryBufferManager : public gpu::GpuMemoryBufferManager {
  public:
   TestGpuMemoryBufferManager();
   ~TestGpuMemoryBufferManager() override;
 
-  // Overridden from GpuMemoryBufferManager:
+  // Overridden from gpu::GpuMemoryBufferManager:
   scoped_ptr<gfx::GpuMemoryBuffer> AllocateGpuMemoryBuffer(
       const gfx::Size& size,
       gfx::GpuMemoryBuffer::Format format,
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc
index 4808117..b2c07da 100644
--- a/cc/trees/layer_tree_host.cc
+++ b/cc/trees/layer_tree_host.cc
@@ -68,7 +68,7 @@
 scoped_ptr<LayerTreeHost> LayerTreeHost::CreateThreaded(
     LayerTreeHostClient* client,
     SharedBitmapManager* shared_bitmap_manager,
-    GpuMemoryBufferManager* gpu_memory_buffer_manager,
+    gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
     const LayerTreeSettings& settings,
     scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
     scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner) {
@@ -84,7 +84,7 @@
     LayerTreeHostClient* client,
     LayerTreeHostSingleThreadClient* single_thread_client,
     SharedBitmapManager* shared_bitmap_manager,
-    GpuMemoryBufferManager* gpu_memory_buffer_manager,
+    gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
     const LayerTreeSettings& settings,
     scoped_refptr<base::SingleThreadTaskRunner> main_task_runner) {
   scoped_ptr<LayerTreeHost> layer_tree_host(new LayerTreeHost(
@@ -94,10 +94,11 @@
   return layer_tree_host.Pass();
 }
 
-LayerTreeHost::LayerTreeHost(LayerTreeHostClient* client,
-                             SharedBitmapManager* shared_bitmap_manager,
-                             GpuMemoryBufferManager* gpu_memory_buffer_manager,
-                             const LayerTreeSettings& settings)
+LayerTreeHost::LayerTreeHost(
+    LayerTreeHostClient* client,
+    SharedBitmapManager* shared_bitmap_manager,
+    gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
+    const LayerTreeSettings& settings)
     : micro_benchmark_controller_(this),
       next_ui_resource_id_(1),
       inside_begin_main_frame_(false),
diff --git a/cc/trees/layer_tree_host.h b/cc/trees/layer_tree_host.h
index b312e50..1096416 100644
--- a/cc/trees/layer_tree_host.h
+++ b/cc/trees/layer_tree_host.h
@@ -41,9 +41,12 @@
 #include "third_party/skia/include/core/SkColor.h"
 #include "ui/gfx/geometry/rect.h"
 
+namespace gpu {
+class GpuMemoryBufferManager;
+}
+
 namespace cc {
 class AnimationRegistrar;
-class GpuMemoryBufferManager;
 class HeadsUpDisplayLayer;
 class Layer;
 class LayerTreeHostImpl;
@@ -85,7 +88,7 @@
   static scoped_ptr<LayerTreeHost> CreateThreaded(
       LayerTreeHostClient* client,
       SharedBitmapManager* shared_bitmap_manager,
-      GpuMemoryBufferManager* gpu_memory_buffer_manager,
+      gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
       const LayerTreeSettings& settings,
       scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
       scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner);
@@ -94,7 +97,7 @@
       LayerTreeHostClient* client,
       LayerTreeHostSingleThreadClient* single_thread_client,
       SharedBitmapManager* shared_bitmap_manager,
-      GpuMemoryBufferManager* gpu_memory_buffer_manager,
+      gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
       const LayerTreeSettings& settings,
       scoped_refptr<base::SingleThreadTaskRunner> main_task_runner);
   virtual ~LayerTreeHost();
@@ -307,7 +310,7 @@
  protected:
   LayerTreeHost(LayerTreeHostClient* client,
                 SharedBitmapManager* shared_bitmap_manager,
-                GpuMemoryBufferManager* gpu_memory_buffer_manager,
+                gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
                 const LayerTreeSettings& settings);
   void InitializeThreaded(
       scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
@@ -456,7 +459,7 @@
   LayerSelectionBound selection_end_;
 
   SharedBitmapManager* shared_bitmap_manager_;
-  GpuMemoryBufferManager* gpu_memory_buffer_manager_;
+  gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager_;
 
   ScopedPtrVector<SwapPromise> swap_promise_list_;
   std::set<SwapPromiseMonitor*> swap_promise_monitor_;
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
index 5e89bbe..be9fd58 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -249,7 +249,7 @@
     Proxy* proxy,
     RenderingStatsInstrumentation* rendering_stats_instrumentation,
     SharedBitmapManager* shared_bitmap_manager,
-    GpuMemoryBufferManager* gpu_memory_buffer_manager,
+    gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
     int id) {
   return make_scoped_ptr(new LayerTreeHostImpl(settings,
                                                client,
@@ -266,7 +266,7 @@
     Proxy* proxy,
     RenderingStatsInstrumentation* rendering_stats_instrumentation,
     SharedBitmapManager* shared_bitmap_manager,
-    GpuMemoryBufferManager* gpu_memory_buffer_manager,
+    gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
     int id)
     : BeginFrameSourceMixIn(),
       client_(client),
@@ -1183,12 +1183,6 @@
   recycle_tree_ = nullptr;
 }
 
-void LayerTreeHostImpl::ResetRecycleTreeForTesting() {
-  if (recycle_tree_)
-    recycle_tree_->DetachLayerTree();
-  recycle_tree_ = nullptr;
-}
-
 void LayerTreeHostImpl::EnforceManagedMemoryPolicy(
     const ManagedMemoryPolicy& policy) {
 
@@ -1286,7 +1280,7 @@
     if (!layer->HasValidTilePriorities())
       continue;
 
-    PictureLayerImpl* twin_layer = layer->GetTwinLayer();
+    PictureLayerImpl* twin_layer = layer->GetPendingOrActiveTwinLayer();
 
     // Ignore the twin layer when tile priorities are invalid.
     // TODO(vmpstr): Iterators should handle this instead. crbug.com/381704
@@ -2991,6 +2985,14 @@
   if (top_controls_manager_)
     top_controls_manager_->PinchEnd();
   client_->SetNeedsCommitOnImplThread();
+  // When a pinch ends, we may be displaying content cached at incorrect scales,
+  // so updating draw properties and drawing will ensure we are using the right
+  // scales that we want when we're not inside a pinch.
+  active_tree_->set_needs_update_draw_properties();
+  SetNeedsRedraw();
+  // TODO(danakj): Don't set root damage. Just updating draw properties and
+  // getting new tiles rastered should be enough! crbug.com/427423
+  SetFullRootLayerDamage();
 }
 
 static void CollectScrollDeltas(ScrollAndScaleSet* scroll_info,
diff --git a/cc/trees/layer_tree_host_impl.h b/cc/trees/layer_tree_host_impl.h
index 450b272..c1e9d1b 100644
--- a/cc/trees/layer_tree_host_impl.h
+++ b/cc/trees/layer_tree_host_impl.h
@@ -121,7 +121,7 @@
       Proxy* proxy,
       RenderingStatsInstrumentation* rendering_stats_instrumentation,
       SharedBitmapManager* shared_bitmap_manager,
-      GpuMemoryBufferManager* gpu_memory_buffer_manager,
+      gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
       int id);
   ~LayerTreeHostImpl() override;
 
@@ -218,7 +218,6 @@
 
   // Resets all of the trees to an empty state.
   void ResetTreesForTesting();
-  void ResetRecycleTreeForTesting();
 
   DrawMode GetDrawMode() const;
 
@@ -490,7 +489,7 @@
       Proxy* proxy,
       RenderingStatsInstrumentation* rendering_stats_instrumentation,
       SharedBitmapManager* shared_bitmap_manager,
-      GpuMemoryBufferManager* gpu_memory_buffer_manager,
+      gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
       int id);
 
   void UpdateViewportContainerSizes();
@@ -701,7 +700,7 @@
   base::Closure tree_activation_callback_;
 
   SharedBitmapManager* shared_bitmap_manager_;
-  GpuMemoryBufferManager* gpu_memory_buffer_manager_;
+  gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager_;
   int id_;
 
   std::set<SwapPromiseMonitor*> swap_promise_monitor_;
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc
index f71edd6..8e7fa0f 100644
--- a/cc/trees/layer_tree_host_impl_unittest.cc
+++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "cc/trees/layer_tree_host_impl.h"
 
+#include <algorithm>
 #include <cmath>
 
 #include "base/bind.h"
@@ -7416,47 +7417,64 @@
 
 TEST_F(LayerTreeHostImplTest, GetPictureLayerImplPairs) {
   host_impl_->CreatePendingTree();
-  host_impl_->ActivateSyncTree();
-  host_impl_->CreatePendingTree();
+  host_impl_->pending_tree()->SetRootLayer(
+      PictureLayerImpl::Create(host_impl_->pending_tree(), 10));
 
-  LayerTreeImpl* active_tree = host_impl_->active_tree();
   LayerTreeImpl* pending_tree = host_impl_->pending_tree();
-  EXPECT_NE(active_tree, pending_tree);
-
-  scoped_ptr<FakePictureLayerImpl> active_layer =
-      FakePictureLayerImpl::Create(active_tree, 10);
-  scoped_ptr<FakePictureLayerImpl> pending_layer =
-      FakePictureLayerImpl::Create(pending_tree, 10);
+  LayerImpl* pending_layer = pending_tree->root_layer();
 
   std::vector<PictureLayerImpl::Pair> layer_pairs;
   host_impl_->GetPictureLayerImplPairs(&layer_pairs);
+  EXPECT_EQ(1u, layer_pairs.size());
+  EXPECT_EQ(pending_layer, layer_pairs[0].pending);
+  EXPECT_EQ(nullptr, layer_pairs[0].active);
 
-  EXPECT_EQ(2u, layer_pairs.size());
-  if (layer_pairs[0].active) {
-    EXPECT_EQ(active_layer.get(), layer_pairs[0].active);
-    EXPECT_EQ(NULL, layer_pairs[0].pending);
-  } else {
-    EXPECT_EQ(pending_layer.get(), layer_pairs[0].pending);
-    EXPECT_EQ(NULL, layer_pairs[0].active);
-  }
+  host_impl_->ActivateSyncTree();
 
-  if (layer_pairs[1].active) {
-    EXPECT_EQ(active_layer.get(), layer_pairs[1].active);
-    EXPECT_EQ(NULL, layer_pairs[1].pending);
-  } else {
-    EXPECT_EQ(pending_layer.get(), layer_pairs[1].pending);
-    EXPECT_EQ(NULL, layer_pairs[1].active);
-  }
+  LayerTreeImpl* active_tree = host_impl_->active_tree();
+  LayerImpl* active_layer = active_tree->root_layer();
+  EXPECT_NE(active_tree, pending_tree);
+  EXPECT_NE(active_layer, pending_layer);
+  EXPECT_NE(nullptr, active_tree);
+  EXPECT_NE(nullptr, active_layer);
 
-  active_layer->set_twin_layer(pending_layer.get());
-  pending_layer->set_twin_layer(active_layer.get());
+  host_impl_->CreatePendingTree();
 
   layer_pairs.clear();
   host_impl_->GetPictureLayerImplPairs(&layer_pairs);
   EXPECT_EQ(1u, layer_pairs.size());
+  EXPECT_EQ(active_layer, layer_pairs[0].active);
+  EXPECT_EQ(pending_layer, layer_pairs[0].pending);
 
-  EXPECT_EQ(active_layer.get(), layer_pairs[0].active);
-  EXPECT_EQ(pending_layer.get(), layer_pairs[0].pending);
+  // Activate, the active layer has no twin now.
+  host_impl_->ActivateSyncTree();
+
+  layer_pairs.clear();
+  host_impl_->GetPictureLayerImplPairs(&layer_pairs);
+  EXPECT_EQ(1u, layer_pairs.size());
+  EXPECT_EQ(active_layer, layer_pairs[0].active);
+  EXPECT_EQ(nullptr, layer_pairs[0].pending);
+
+  // Create another layer in the pending tree that's not in the active tree. We
+  // should get two pairs.
+  host_impl_->CreatePendingTree();
+  host_impl_->pending_tree()->root_layer()->AddChild(
+      PictureLayerImpl::Create(host_impl_->pending_tree(), 11));
+
+  LayerImpl* new_pending_layer = pending_tree->root_layer()->children()[0];
+
+  layer_pairs.clear();
+  host_impl_->GetPictureLayerImplPairs(&layer_pairs);
+  EXPECT_EQ(2u, layer_pairs.size());
+
+  // The pair ordering is flaky, so make it consistent.
+  if (layer_pairs[0].active != active_layer)
+    std::swap(layer_pairs[0], layer_pairs[1]);
+
+  EXPECT_EQ(active_layer, layer_pairs[0].active);
+  EXPECT_EQ(pending_layer, layer_pairs[0].pending);
+  EXPECT_EQ(new_pending_layer, layer_pairs[1].pending);
+  EXPECT_EQ(nullptr, layer_pairs[1].active);
 }
 
 TEST_F(LayerTreeHostImplTest, DidBecomeActive) {
diff --git a/cc/trees/layer_tree_host_pixeltest_blending.cc b/cc/trees/layer_tree_host_pixeltest_blending.cc
index 5bce9dd..7a9ef21 100644
--- a/cc/trees/layer_tree_host_pixeltest_blending.cc
+++ b/cc/trees/layer_tree_host_pixeltest_blending.cc
@@ -233,31 +233,27 @@
 
     if ((flags & kUseAntialiasing) && (type == PIXEL_TEST_GL)) {
       // Anti aliasing causes differences up to 7 pixels at the edges.
-      int large_error_allowed = 7;
+      // Several pixels have 9 units difference on the alpha channel.
+      int large_error_allowed = (flags & kUseMasks) ? 7 : 9;
       // Blending results might differ with one pixel.
       int small_error_allowed = 1;
       // Most of the errors are one pixel errors.
-      float percentage_pixels_small_error = 12.5f;
+      float percentage_pixels_small_error = (flags & kUseMasks) ? 7.7f : 12.1f;
       // Because of anti-aliasing, around 3% of pixels (at the edges) have
       // bigger errors (from small_error_allowed + 1 to large_error_allowed).
-      float percentage_pixels_error = 15.0f;
+      float percentage_pixels_error = (flags & kUseMasks) ? 12.4f : 15.f;
       // The average error is still close to 1.
-      float average_error_allowed_in_bad_pixels = 1.3f;
+      float average_error_allowed_in_bad_pixels =
+          (flags & kUseMasks) ? 1.3f : 1.f;
 
       // The sepia filter generates more small errors, but the number of large
       // errors remains around 3%.
       if (flags & kUseColorMatrix) {
-        percentage_pixels_small_error = 26.f;
-        percentage_pixels_error = 29.f;
+        percentage_pixels_small_error = (flags & kUseMasks) ? 14.0f : 26.f;
+        percentage_pixels_error = (flags & kUseMasks) ? 18.5f : 29.f;
+        average_error_allowed_in_bad_pixels = (flags & kUseMasks) ? 0.9f : 0.7f;
       }
 
-      // Anti-aliased pixels in combination with non-separable blend modes and
-      // a white background produces several black pixels (6 for these tests).
-      // Having a mask will hide the black pixels.
-      // TODO(rosca): fix this issue for non-separable blend modes.
-      if (!(flags & kUseMasks))
-        large_error_allowed = 255;
-
       pixel_comparator_.reset(
           new FuzzyPixelComparator(false,  // discard_alpha
                                    percentage_pixels_error,
diff --git a/cc/trees/layer_tree_host_unittest_picture.cc b/cc/trees/layer_tree_host_unittest_picture.cc
index b81fdff..2d485b4 100644
--- a/cc/trees/layer_tree_host_unittest_picture.cc
+++ b/cc/trees/layer_tree_host_unittest_picture.cc
@@ -66,13 +66,13 @@
 
     if (!active_root_impl) {
       EXPECT_EQ(0, activates_);
-      EXPECT_EQ(NULL, pending_picture_impl->twin_layer());
+      EXPECT_EQ(nullptr, pending_picture_impl->GetPendingOrActiveTwinLayer());
       return;
     }
 
     if (active_root_impl->children().empty()) {
       EXPECT_EQ(3, activates_);
-      EXPECT_EQ(NULL, pending_picture_impl->twin_layer());
+      EXPECT_EQ(nullptr, pending_picture_impl->GetPendingOrActiveTwinLayer());
       return;
     }
 
@@ -84,20 +84,28 @@
     // and the next commit will have a pending and active twin again.
     EXPECT_TRUE(activates_ == 1 || activates_ == 4);
 
-    EXPECT_EQ(pending_picture_impl, active_picture_impl->twin_layer());
-    EXPECT_EQ(active_picture_impl, pending_picture_impl->twin_layer());
+    EXPECT_EQ(pending_picture_impl,
+              active_picture_impl->GetPendingOrActiveTwinLayer());
+    EXPECT_EQ(active_picture_impl,
+              pending_picture_impl->GetPendingOrActiveTwinLayer());
+    EXPECT_EQ(nullptr, active_picture_impl->GetRecycledTwinLayer());
   }
 
   void DidActivateTreeOnThread(LayerTreeHostImpl* impl) override {
     LayerImpl* active_root_impl = impl->active_tree()->root_layer();
+    LayerImpl* recycle_root_impl = impl->recycle_tree()->root_layer();
 
     if (active_root_impl->children().empty()) {
       EXPECT_EQ(2, activates_);
     } else {
       FakePictureLayerImpl* active_picture_impl =
           static_cast<FakePictureLayerImpl*>(active_root_impl->children()[0]);
+      FakePictureLayerImpl* recycle_picture_impl =
+          static_cast<FakePictureLayerImpl*>(recycle_root_impl->children()[0]);
 
-      EXPECT_EQ(NULL, active_picture_impl->twin_layer());
+      EXPECT_EQ(nullptr, active_picture_impl->GetPendingOrActiveTwinLayer());
+      EXPECT_EQ(recycle_picture_impl,
+                active_picture_impl->GetRecycledTwinLayer());
     }
 
     ++activates_;
diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc
index 1fe9ba6..304b9fb 100644
--- a/cc/trees/layer_tree_impl.cc
+++ b/cc/trees/layer_tree_impl.cc
@@ -750,13 +750,6 @@
   return tree->LayerById(id);
 }
 
-LayerImpl* LayerTreeImpl::FindRecycleTreeLayerById(int id) {
-  LayerTreeImpl* tree = layer_tree_host_impl_->recycle_tree();
-  if (!tree)
-    return NULL;
-  return tree->LayerById(id);
-}
-
 bool LayerTreeImpl::PinchGestureActive() const {
   return layer_tree_host_impl_->pinch_gesture_active();
 }
diff --git a/cc/trees/layer_tree_impl.h b/cc/trees/layer_tree_impl.h
index 260b90b..57e6ca1 100644
--- a/cc/trees/layer_tree_impl.h
+++ b/cc/trees/layer_tree_impl.h
@@ -77,7 +77,6 @@
   bool IsRecycleTree() const;
   LayerImpl* FindActiveTreeLayerById(int id);
   LayerImpl* FindPendingTreeLayerById(int id);
-  LayerImpl* FindRecycleTreeLayerById(int id);
   bool PinchGestureActive() const;
   BeginFrameArgs CurrentBeginFrameArgs() const;
   base::TimeDelta begin_impl_frame_interval() const;
diff --git a/cc/trees/thread_proxy.cc b/cc/trees/thread_proxy.cc
index 429b587..f5496f8 100644
--- a/cc/trees/thread_proxy.cc
+++ b/cc/trees/thread_proxy.cc
@@ -107,7 +107,6 @@
       next_frame_is_newly_committed_frame(false),
       inside_draw(false),
       input_throttled_until_commit(false),
-      did_commit_after_animating(false),
       smoothness_priority_expiration_notifier(
           proxy->ImplThreadTaskRunner(),
           base::Bind(&ThreadProxy::RenewTreePriority, base::Unretained(proxy)),
@@ -937,7 +936,6 @@
   impl().animation_time =
       impl().layer_tree_host_impl->CurrentBeginFrameArgs().frame_time;
   impl().layer_tree_host_impl->Animate(impl().animation_time);
-  impl().did_commit_after_animating = false;
 }
 
 void ThreadProxy::ScheduledActionCommit() {
@@ -951,8 +949,6 @@
   impl().current_resource_update_controller->Finalize();
   impl().current_resource_update_controller = nullptr;
 
-  impl().did_commit_after_animating = true;
-
   blocked_main().main_thread_inside_commit = true;
   impl().layer_tree_host_impl->BeginCommit();
   layer_tree_host()->BeginCommitOnImplThread(impl().layer_tree_host_impl.get());
@@ -1020,11 +1016,6 @@
   impl().timing_history.DidStartDrawing();
   base::AutoReset<bool> mark_inside(&impl().inside_draw, true);
 
-  if (impl().did_commit_after_animating) {
-    impl().layer_tree_host_impl->Animate(impl().animation_time);
-    impl().did_commit_after_animating = false;
-  }
-
   if (impl().layer_tree_host_impl->pending_tree())
     impl().layer_tree_host_impl->pending_tree()->UpdateDrawProperties();
 
diff --git a/crypto/BUILD.gn b/crypto/BUILD.gn
index 43e20a5..d3d318d 100644
--- a/crypto/BUILD.gn
+++ b/crypto/BUILD.gn
@@ -49,6 +49,8 @@
     "nss_util.cc",
     "nss_util.h",
     "nss_util_internal.h",
+    "openssl_bio_string.cc",
+    "openssl_bio_string.h",
     "openssl_util.cc",
     "openssl_util.h",
     "p224.cc",
@@ -151,6 +153,8 @@
       "ec_signature_creator_openssl.cc",
       "encryptor_openssl.cc",
       "hmac_openssl.cc",
+      "openssl_bio_string.cc",
+      "openssl_bio_string.h",
       "openssl_util.cc",
       "openssl_util.h",
       "rsa_private_key_openssl.cc",
@@ -205,6 +209,7 @@
     "hkdf_unittest.cc",
     "hmac_unittest.cc",
     "nss_util_unittest.cc",
+    "openssl_bio_string_unittest.cc",
     "p224_unittest.cc",
     "p224_spake_unittest.cc",
     "random_unittest.cc",
@@ -225,6 +230,8 @@
 
   if (use_openssl) {
     sources -= [ "nss_util_unittest.cc" ]
+  } else {
+    sources -= [ "openssl_bio_string_unittest.cc" ]
   }
 
   deps = [
diff --git a/gin/isolate_holder.cc b/gin/isolate_holder.cc
index 740e136..334c0e0 100644
--- a/gin/isolate_holder.cc
+++ b/gin/isolate_holder.cc
@@ -18,6 +18,11 @@
 #include "gin/public/v8_platform.h"
 #include "gin/run_microtasks_observer.h"
 
+#ifdef V8_USE_EXTERNAL_STARTUP_DATA
+#include "base/files/memory_mapped_file.h"
+#include "base/path_service.h"
+#endif  // V8_USE_EXTERNAL_STARTUP_DATA
+
 namespace gin {
 
 namespace {
@@ -29,8 +34,70 @@
   return true;
 }
 
+#ifdef V8_USE_EXTERNAL_STARTUP_DATA
+base::MemoryMappedFile* g_mapped_natives = NULL;
+base::MemoryMappedFile* g_mapped_snapshot = NULL;
+
+bool MapV8Files(base::FilePath* natives_path, base::FilePath* snapshot_path,
+                int natives_fd = -1, int snapshot_fd = -1) {
+  int flags = base::File::FLAG_OPEN | base::File::FLAG_READ;
+
+  g_mapped_natives = new base::MemoryMappedFile;
+  if (!g_mapped_natives->IsValid()) {
+    if (natives_fd == -1
+        ? !g_mapped_natives->Initialize(base::File(*natives_path, flags))
+        : !g_mapped_natives->Initialize(base::File(natives_fd))) {
+      delete g_mapped_natives;
+      g_mapped_natives = NULL;
+      LOG(FATAL) << "Couldn't mmap v8 natives data file";
+      return false;
+    }
+  }
+
+  g_mapped_snapshot = new base::MemoryMappedFile;
+  if (!g_mapped_snapshot->IsValid()) {
+    if (snapshot_fd == -1
+        ? !g_mapped_snapshot->Initialize(base::File(*snapshot_path, flags))
+        : !g_mapped_snapshot->Initialize(base::File(snapshot_fd))) {
+      delete g_mapped_snapshot;
+      g_mapped_snapshot = NULL;
+      LOG(ERROR) << "Couldn't mmap v8 snapshot data file";
+      return false;
+    }
+  }
+
+  return true;
+}
+#endif  // V8_USE_EXTERNAL_STARTUP_DATA
+
 }  // namespace
 
+
+#ifdef V8_USE_EXTERNAL_STARTUP_DATA
+// static
+bool IsolateHolder::LoadV8Snapshot() {
+  if (g_mapped_natives && g_mapped_snapshot)
+    return true;
+
+  base::FilePath data_path;
+  PathService::Get(base::DIR_ANDROID_APP_DATA, &data_path);
+  DCHECK(!data_path.empty());
+
+  base::FilePath natives_path = data_path.AppendASCII("natives_blob.bin");
+  base::FilePath snapshot_path = data_path.AppendASCII("snapshot_blob.bin");
+
+  return MapV8Files(&natives_path, &snapshot_path);
+}
+
+//static
+bool IsolateHolder::LoadV8SnapshotFD(int natives_fd, int snapshot_fd) {
+  if (g_mapped_natives && g_mapped_snapshot)
+    return true;
+
+  return MapV8Files(NULL, NULL, natives_fd, snapshot_fd);
+}
+#endif  // V8_USE_EXTERNAL_STARTUP_DATA
+
 IsolateHolder::IsolateHolder() {
   CHECK(g_array_buffer_allocator)
       << "You need to invoke gin::IsolateHolder::Initialize first";
@@ -88,6 +155,19 @@
     v8::V8::SetFlagsFromString(v8_flags, sizeof(v8_flags) - 1);
   }
   v8::V8::SetEntropySource(&GenerateEntropy);
+#ifdef V8_USE_EXTERNAL_STARTUP_DATA
+  v8::StartupData natives;
+  natives.data = reinterpret_cast<const char*>(g_mapped_natives->data());
+  natives.raw_size = g_mapped_natives->length();
+  natives.compressed_size = g_mapped_natives->length();
+  v8::V8::SetNativesDataBlob(&natives);
+
+  v8::StartupData snapshot;
+  snapshot.data = reinterpret_cast<const char*>(g_mapped_snapshot->data());
+  snapshot.raw_size = g_mapped_snapshot->length();
+  snapshot.compressed_size = g_mapped_snapshot->length();
+  v8::V8::SetSnapshotDataBlob(&snapshot);
+#endif  // V8_USE_EXTERNAL_STARTUP_DATA
   v8::V8::Initialize();
   v8_is_initialized = true;
 }
diff --git a/gin/public/isolate_holder.h b/gin/public/isolate_holder.h
index 29cc208..4e14ade 100644
--- a/gin/public/isolate_holder.h
+++ b/gin/public/isolate_holder.h
@@ -31,7 +31,9 @@
   ~IsolateHolder();
 
   // Should be invoked once before creating IsolateHolder instances to
-  // initialize V8 and Gin.
+  // initialize V8 and Gin. In case V8_USE_EXTERNAL_STARTUP_DATA is defined,
+  // V8's initial snapshot should be loaded (by calling LoadV8Snapshot or
+  // LoadV8SnapshotFD) before calling Initialize.
   static void Initialize(ScriptMode mode,
                          v8::ArrayBuffer::Allocator* allocator);
 
@@ -49,6 +51,13 @@
   // thread.
   void RemoveRunMicrotasksObserver();
 
+#ifdef V8_USE_EXTERNAL_STARTUP_DATA
+#ifdef OS_ANDROID
+  static bool LoadV8SnapshotFD(int natives_fd, int snapshot_fd);
+#endif
+  static bool LoadV8Snapshot();
+#endif  // V8_USE_EXTERNAL_STARTUP_DATA
+
  private:
   v8::Isolate* isolate_;
   scoped_ptr<PerIsolateData> isolate_data_;
diff --git a/gin/shell/gin_main.cc b/gin/shell/gin_main.cc
index b17ec0a..2f7998e 100644
--- a/gin/shell/gin_main.cc
+++ b/gin/shell/gin_main.cc
@@ -60,6 +60,9 @@
   base::AtExitManager at_exit;
   CommandLine::Init(argc, argv);
   base::i18n::InitializeICU();
+#ifdef V8_USE_EXTERNAL_STARTUP_DATA
+  gin::IsolateHolder::LoadV8Snapshot();
+#endif
 
   gin::IsolateHolder::Initialize(gin::IsolateHolder::kStrictMode,
                                  gin::ArrayBufferAllocator::SharedInstance());
diff --git a/gin/shell_runner_unittest.cc b/gin/shell_runner_unittest.cc
index 07ab678..7134de1 100644
--- a/gin/shell_runner_unittest.cc
+++ b/gin/shell_runner_unittest.cc
@@ -10,6 +10,10 @@
 #include "gin/public/isolate_holder.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+#ifdef V8_USE_EXTERNAL_STARTUP_DATA
+#include "gin/public/isolate_holder.h"
+#endif
+
 using v8::Isolate;
 using v8::Object;
 using v8::Script;
@@ -20,6 +24,10 @@
 TEST(RunnerTest, Run) {
   std::string source = "this.result = 'PASS';\n";
 
+#ifdef V8_USE_EXTERNAL_STARTUP_DATA
+  gin::IsolateHolder::LoadV8Snapshot();
+#endif
+
   gin::IsolateHolder::Initialize(gin::IsolateHolder::kStrictMode,
                                  gin::ArrayBufferAllocator::SharedInstance());
   gin::IsolateHolder instance;
diff --git a/gin/test/file_runner.cc b/gin/test/file_runner.cc
index 83228d6..b639d06 100644
--- a/gin/test/file_runner.cc
+++ b/gin/test/file_runner.cc
@@ -19,6 +19,10 @@
 #include "gin/try_catch.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+#ifdef V8_USE_EXTERNAL_STARTUP_DATA
+#include "gin/public/isolate_holder.h"
+#endif
+
 namespace gin {
 
 namespace {
@@ -58,6 +62,10 @@
 
   base::MessageLoop message_loop;
 
+#ifdef V8_USE_EXTERNAL_STARTUP_DATA
+  gin::IsolateHolder::LoadV8Snapshot();
+#endif
+
   gin::IsolateHolder::Initialize(gin::IsolateHolder::kStrictMode,
                                  gin::ArrayBufferAllocator::SharedInstance());
   gin::IsolateHolder instance;
diff --git a/gin/test/v8_test.cc b/gin/test/v8_test.cc
index cb6d573..a022511 100644
--- a/gin/test/v8_test.cc
+++ b/gin/test/v8_test.cc
@@ -7,6 +7,10 @@
 #include "gin/array_buffer.h"
 #include "gin/public/isolate_holder.h"
 
+#ifdef V8_USE_EXTERNAL_STARTUP_DATA
+#include "gin/public/isolate_holder.h"
+#endif
+
 using v8::Context;
 using v8::Local;
 using v8::HandleScope;
@@ -20,6 +24,9 @@
 }
 
 void V8Test::SetUp() {
+#ifdef V8_USE_EXTERNAL_STARTUP_DATA
+  gin::IsolateHolder::LoadV8Snapshot();
+#endif
   gin::IsolateHolder::Initialize(gin::IsolateHolder::kStrictMode,
                                  gin::ArrayBufferAllocator::SharedInstance());
   instance_.reset(new gin::IsolateHolder);
diff --git a/gin/v8.isolate b/gin/v8.isolate
new file mode 100644
index 0000000..14d8a2c
--- /dev/null
+++ b/gin/v8.isolate
@@ -0,0 +1,15 @@
+# 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.
+{
+  'conditions': [
+    ['v8_use_external_startup_data==1', {
+      'variables': {
+        'isolate_dependency_tracked': [
+          '<(PRODUCT_DIR)/natives_blob.bin',
+          '<(PRODUCT_DIR)/snapshot_blob.bin',
+        ],
+      },
+    }],
+  ],
+}
diff --git a/gpu/BUILD.gn b/gpu/BUILD.gn
index d1df1dd..29c0796 100644
--- a/gpu/BUILD.gn
+++ b/gpu/BUILD.gn
@@ -115,12 +115,15 @@
     "//gpu/command_buffer/client:gles2_implementation_client_side_arrays",
   ]
 
+  libs = []
+
+  if (is_android) {
+    deps += [
+      "//testing/android:native_test_native_code",
+    ]
+    libs += [ "android" ]
+  }
   # TODO(GYP)
-  #     ['OS == "android"', {
-  #       'dependencies': [
-  #         '../testing/android/native_test.gyp:native_test_native_code',
-  #       ],
-  #     }],
   #     ['OS == "win"', {
   #       'dependencies': [
   #         '../third_party/angle/src/build_angle.gyp:libEGL',
diff --git a/gpu/command_buffer/client/BUILD.gn b/gpu/command_buffer/client/BUILD.gn
index 9b4749f..9d8db96 100644
--- a/gpu/command_buffer/client/BUILD.gn
+++ b/gpu/command_buffer/client/BUILD.gn
@@ -104,6 +104,16 @@
   ]
 }
 
+source_set("gpu_memory_buffer_manager") {
+  sources = [
+    "gpu_memory_buffer_manager.cc",
+    "gpu_memory_buffer_manager.h",
+  ]
+  deps = [
+    "//ui/gfx",
+  ]
+}
+
 # Library emulates GLES2 using command_buffers.
 component("gles2_implementation") {
   sources = gles2_implementation_source_files
@@ -161,6 +171,7 @@
 
   deps = [
     ":gles2_implementation",
+    ":gpu_memory_buffer_manager",
     "//gpu",
     "//gpu/command_buffer/common:gles2_utils",
     "//base",
diff --git a/gpu/command_buffer/client/buffer_tracker_unittest.cc b/gpu/command_buffer/client/buffer_tracker_unittest.cc
index a244009..a928396 100644
--- a/gpu/command_buffer/client/buffer_tracker_unittest.cc
+++ b/gpu/command_buffer/client/buffer_tracker_unittest.cc
@@ -53,7 +53,7 @@
   static const int32 kCommandBufferSizeBytes =
       kNumCommandEntries * sizeof(CommandBufferEntry);
 
-  virtual void SetUp() {
+  void SetUp() override {
     command_buffer_.reset(new MockClientCommandBufferImpl());
     helper_.reset(new GLES2CmdHelper(command_buffer_.get()));
     helper_->Initialize(kCommandBufferSizeBytes);
@@ -62,7 +62,7 @@
     buffer_tracker_.reset(new BufferTracker(mapped_memory_.get()));
   }
 
-  virtual void TearDown() {
+  void TearDown() override {
     buffer_tracker_.reset();
     mapped_memory_.reset();
     helper_.reset();
diff --git a/gpu/command_buffer/client/fenced_allocator_test.cc b/gpu/command_buffer/client/fenced_allocator_test.cc
index e746be6..3af9367 100644
--- a/gpu/command_buffer/client/fenced_allocator_test.cc
+++ b/gpu/command_buffer/client/fenced_allocator_test.cc
@@ -37,7 +37,7 @@
   static const unsigned int kBufferSize = 1024;
   static const int kAllocAlignment = 16;
 
-  virtual void SetUp() {
+  void SetUp() override {
     api_mock_.reset(new AsyncAPIMock(true));
     // ignore noops in the mock - we don't want to inspect the internals of the
     // helper.
@@ -100,14 +100,14 @@
 // and SetToken are properly forwarded to the engine.
 class FencedAllocatorTest : public BaseFencedAllocatorTest {
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     BaseFencedAllocatorTest::SetUp();
     allocator_.reset(new FencedAllocator(kBufferSize,
                                          helper_.get(),
                                          base::Bind(&EmptyPoll)));
   }
 
-  virtual void TearDown() {
+  void TearDown() override {
     // If the GpuScheduler posts any tasks, this forces them to run.
     base::MessageLoop::current()->RunUntilIdle();
 
@@ -463,7 +463,7 @@
 // forwarded to the engine.
 class FencedAllocatorWrapperTest : public BaseFencedAllocatorTest {
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     BaseFencedAllocatorTest::SetUp();
 
     // Though allocating this buffer isn't strictly necessary, it makes
@@ -477,7 +477,7 @@
                                                 buffer_.get()));
   }
 
-  virtual void TearDown() {
+  void TearDown() override {
     // If the GpuScheduler posts any tasks, this forces them to run.
     base::MessageLoop::current()->RunUntilIdle();
 
diff --git a/gpu/command_buffer/client/gles2_implementation_autogen.h b/gpu/command_buffer/client/gles2_implementation_autogen.h
index 3ef98dd..4e547d9 100644
--- a/gpu/command_buffer/client/gles2_implementation_autogen.h
+++ b/gpu/command_buffer/client/gles2_implementation_autogen.h
@@ -691,6 +691,6 @@
 
 void MatrixLoadIdentityCHROMIUM(GLenum matrixMode) override;
 
-virtual void BlendBarrierKHR() override;
+void BlendBarrierKHR() override;
 
 #endif  // GPU_COMMAND_BUFFER_CLIENT_GLES2_IMPLEMENTATION_AUTOGEN_H_
diff --git a/gpu/command_buffer/client/gles2_implementation_unittest.cc b/gpu/command_buffer/client/gles2_implementation_unittest.cc
index 7b3ec2d..4102060 100644
--- a/gpu/command_buffer/client/gles2_implementation_unittest.cc
+++ b/gpu/command_buffer/client/gles2_implementation_unittest.cc
@@ -504,8 +504,8 @@
 
   GLES2ImplementationTest() : commands_(NULL) {}
 
-  virtual void SetUp() override;
-  virtual void TearDown() override;
+  void SetUp() override;
+  void TearDown() override;
 
   bool NoCommandsWritten() {
     scoped_refptr<Buffer> ring_buffer = helper_->get_ring_buffer();
@@ -628,12 +628,12 @@
 
 class GLES2ImplementationManualInitTest : public GLES2ImplementationTest {
  protected:
-  virtual void SetUp() override {}
+  void SetUp() override {}
 };
 
 class GLES2ImplementationStrictSharedTest : public GLES2ImplementationTest {
  protected:
-  virtual void SetUp() override;
+  void SetUp() override;
 
   template <class ResApi>
   void FlushGenerationTest() {
diff --git a/gpu/command_buffer/client/gpu_memory_buffer_manager.cc b/gpu/command_buffer/client/gpu_memory_buffer_manager.cc
new file mode 100644
index 0000000..dbfa593
--- /dev/null
+++ b/gpu/command_buffer/client/gpu_memory_buffer_manager.cc
@@ -0,0 +1,15 @@
+// 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 "gpu/command_buffer/client/gpu_memory_buffer_manager.h"
+
+namespace gpu {
+
+GpuMemoryBufferManager::GpuMemoryBufferManager() {
+}
+
+GpuMemoryBufferManager::~GpuMemoryBufferManager() {
+}
+
+}  // namespace gpu
diff --git a/cc/resources/gpu_memory_buffer_manager.h b/gpu/command_buffer/client/gpu_memory_buffer_manager.h
similarity index 67%
rename from cc/resources/gpu_memory_buffer_manager.h
rename to gpu/command_buffer/client/gpu_memory_buffer_manager.h
index 52434e0..cc422bf 100644
--- a/cc/resources/gpu_memory_buffer_manager.h
+++ b/gpu/command_buffer/client/gpu_memory_buffer_manager.h
@@ -2,18 +2,20 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CC_RESOURCES_GPU_MEMORY_BUFFER_MANAGER_H_
-#define CC_RESOURCES_GPU_MEMORY_BUFFER_MANAGER_H_
+#ifndef GPU_COMMAND_BUFFER_CLIENT_GPU_MEMORY_BUFFER_MANAGER_H_
+#define GPU_COMMAND_BUFFER_CLIENT_GPU_MEMORY_BUFFER_MANAGER_H_
 
 #include "base/memory/scoped_ptr.h"
-#include "cc/base/cc_export.h"
+#include "gpu/gpu_export.h"
 #include "ui/gfx/geometry/size.h"
 #include "ui/gfx/gpu_memory_buffer.h"
 
-namespace cc {
+namespace gpu {
 
-class CC_EXPORT GpuMemoryBufferManager {
+class GPU_EXPORT GpuMemoryBufferManager {
  public:
+  GpuMemoryBufferManager();
+
   // Allocates a GpuMemoryBuffer that can be shared with another process.
   virtual scoped_ptr<gfx::GpuMemoryBuffer> AllocateGpuMemoryBuffer(
       const gfx::Size& size,
@@ -26,9 +28,9 @@
       ClientBuffer buffer) = 0;
 
  protected:
-  virtual ~GpuMemoryBufferManager() {}
+  virtual ~GpuMemoryBufferManager();
 };
 
-}  // namespace cc
+}  // namespace gpu
 
-#endif  // CC_RESOURCES_GPU_MEMORY_BUFFER_MANAGER_H_
+#endif  // GPU_COMMAND_BUFFER_CLIENT_GPU_MEMORY_BUFFER_MANAGER_H_
diff --git a/gpu/command_buffer/client/mapped_memory_unittest.cc b/gpu/command_buffer/client/mapped_memory_unittest.cc
index 963640a..9d5bada 100644
--- a/gpu/command_buffer/client/mapped_memory_unittest.cc
+++ b/gpu/command_buffer/client/mapped_memory_unittest.cc
@@ -33,7 +33,7 @@
  protected:
   static const unsigned int kBufferSize = 1024;
 
-  virtual void SetUp() {
+  void SetUp() override {
     api_mock_.reset(new AsyncAPIMock(true));
     // ignore noops in the mock - we don't want to inspect the internals of the
     // helper.
@@ -98,7 +98,7 @@
 class MemoryChunkTest : public MappedMemoryTestBase {
  protected:
   static const int32 kShmId = 123;
-  virtual void SetUp() {
+  void SetUp() override {
     MappedMemoryTestBase::SetUp();
     scoped_ptr<base::SharedMemory> shared_memory(new base::SharedMemory());
     shared_memory->CreateAndMapAnonymous(kBufferSize);
@@ -109,7 +109,7 @@
                                  base::Bind(&EmptyPoll)));
   }
 
-  virtual void TearDown() {
+  void TearDown() override {
     // If the GpuScheduler posts any tasks, this forces them to run.
     base::MessageLoop::current()->RunUntilIdle();
 
@@ -163,13 +163,13 @@
   }
 
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     MappedMemoryTestBase::SetUp();
     manager_.reset(new MappedMemoryManager(
         helper_.get(), base::Bind(&EmptyPoll), MappedMemoryManager::kNoLimit));
   }
 
-  virtual void TearDown() {
+  void TearDown() override {
     // If the GpuScheduler posts any tasks, this forces them to run.
     base::MessageLoop::current()->RunUntilIdle();
     manager_.reset();
diff --git a/gpu/command_buffer/client/program_info_manager_unittest.cc b/gpu/command_buffer/client/program_info_manager_unittest.cc
index e5002fd..ba62703 100644
--- a/gpu/command_buffer/client/program_info_manager_unittest.cc
+++ b/gpu/command_buffer/client/program_info_manager_unittest.cc
@@ -14,11 +14,9 @@
 
 class ProgramInfoManagerTest : public testing::Test {
  protected:
-  virtual void SetUp() {
-  }
+  void SetUp() override {}
 
-  virtual void TearDown() {
-  }
+  void TearDown() override {}
 
   scoped_ptr<ProgramInfoManager> program_info_manager_;
 };
diff --git a/gpu/command_buffer/client/query_tracker_unittest.cc b/gpu/command_buffer/client/query_tracker_unittest.cc
index cd2ccf6..53f5195 100644
--- a/gpu/command_buffer/client/query_tracker_unittest.cc
+++ b/gpu/command_buffer/client/query_tracker_unittest.cc
@@ -29,7 +29,7 @@
   static const int32 kCommandBufferSizeBytes =
       kNumCommandEntries * sizeof(CommandBufferEntry);
 
-  virtual void SetUp() {
+  void SetUp() override {
     command_buffer_.reset(new MockClientCommandBuffer());
     helper_.reset(new GLES2CmdHelper(command_buffer_.get()));
     helper_->Initialize(kCommandBufferSizeBytes);
@@ -38,7 +38,7 @@
     sync_manager_.reset(new QuerySyncManager(mapped_memory_.get()));
   }
 
-  virtual void TearDown() {
+  void TearDown() override {
     sync_manager_.reset();
     mapped_memory_.reset();
     helper_.reset();
@@ -83,7 +83,7 @@
   static const int32 kCommandBufferSizeBytes =
       kNumCommandEntries * sizeof(CommandBufferEntry);
 
-  virtual void SetUp() {
+  void SetUp() override {
     command_buffer_.reset(new MockClientCommandBuffer());
     helper_.reset(new GLES2CmdHelper(command_buffer_.get()));
     helper_->Initialize(kCommandBufferSizeBytes);
@@ -92,7 +92,7 @@
     query_tracker_.reset(new QueryTracker(mapped_memory_.get()));
   }
 
-  virtual void TearDown() {
+  void TearDown() override {
     query_tracker_.reset();
     mapped_memory_.reset();
     helper_.reset();
diff --git a/gpu/command_buffer/client/ring_buffer_test.cc b/gpu/command_buffer/client/ring_buffer_test.cc
index b3aca13..c1aab88 100644
--- a/gpu/command_buffer/client/ring_buffer_test.cc
+++ b/gpu/command_buffer/client/ring_buffer_test.cc
@@ -58,7 +58,7 @@
       api_mock_->SetToken(cmd::kSetToken, 1, _args);
   }
 
-  virtual void SetUp() {
+  void SetUp() override {
     delay_set_token_ = false;
     api_mock_.reset(new AsyncAPIMock(true));
     // ignore noops in the mock - we don't want to inspect the internals of the
@@ -123,7 +123,7 @@
 // and SetToken are properly forwarded to the engine.
 class RingBufferTest : public BaseRingBufferTest {
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     BaseRingBufferTest::SetUp();
 
     buffer_.reset(new int8[kBufferSize + kBaseOffset]);
@@ -132,7 +132,7 @@
                                     helper_.get(), buffer_start_));
   }
 
-  virtual void TearDown() {
+  void TearDown() override {
     // If the GpuScheduler posts any tasks, this forces them to run.
     base::MessageLoop::current()->RunUntilIdle();
 
diff --git a/gpu/command_buffer/client/transfer_buffer_unittest.cc b/gpu/command_buffer/client/transfer_buffer_unittest.cc
index 4e99ba9..7dac4f5 100644
--- a/gpu/command_buffer/client/transfer_buffer_unittest.cc
+++ b/gpu/command_buffer/client/transfer_buffer_unittest.cc
@@ -36,8 +36,8 @@
       : transfer_buffer_id_(0) {
   }
 
-  virtual void SetUp() override;
-  virtual void TearDown() override;
+  void SetUp() override;
+  void TearDown() override;
 
   virtual void Initialize(unsigned int size_to_flush) {
     ASSERT_TRUE(transfer_buffer_->Initialize(
@@ -248,8 +248,8 @@
       : transfer_buffer_id_(0) {
   }
 
-  virtual void SetUp() override;
-  virtual void TearDown() override;
+  void SetUp() override;
+  void TearDown() override;
 
   MockClientCommandBufferCanFail* command_buffer() const {
     return command_buffer_.get();
diff --git a/gpu/command_buffer/client/vertex_array_object_manager_unittest.cc b/gpu/command_buffer/client/vertex_array_object_manager_unittest.cc
index b3ac065..e891184 100644
--- a/gpu/command_buffer/client/vertex_array_object_manager_unittest.cc
+++ b/gpu/command_buffer/client/vertex_array_object_manager_unittest.cc
@@ -16,14 +16,13 @@
   static const GLuint kClientSideArrayBuffer = 0x1234;
   static const GLuint kClientSideElementArrayBuffer = 0x1235;
 
-  virtual void SetUp() {
+  void SetUp() override {
     manager_.reset(new VertexArrayObjectManager(
         kMaxAttribs,
         kClientSideArrayBuffer,
         kClientSideElementArrayBuffer));
   }
-  virtual void TearDown() {
-  }
+  void TearDown() override {}
 
   scoped_ptr<VertexArrayObjectManager> manager_;
 };
diff --git a/gpu/command_buffer/common/capabilities.cc b/gpu/command_buffer/common/capabilities.cc
index eacf10c..f905f4e 100644
--- a/gpu/command_buffer/common/capabilities.cc
+++ b/gpu/command_buffer/common/capabilities.cc
@@ -20,7 +20,6 @@
       sync_query(false),
       image(false),
       future_sync_points(false),
-      blend_minmax(false),
       blend_equation_advanced(false),
       blend_equation_advanced_coherent(false) {
 }
diff --git a/gpu/command_buffer/common/capabilities.h b/gpu/command_buffer/common/capabilities.h
index 9de6023..fff1ef8 100644
--- a/gpu/command_buffer/common/capabilities.h
+++ b/gpu/command_buffer/common/capabilities.h
@@ -23,7 +23,6 @@
   bool sync_query;
   bool image;
   bool future_sync_points;
-  bool blend_minmax;
   bool blend_equation_advanced;
   bool blend_equation_advanced_coherent;
 
diff --git a/gpu/command_buffer/common/command_buffer_shared_test.cc b/gpu/command_buffer/common/command_buffer_shared_test.cc
index d2c599a..65a2429 100644
--- a/gpu/command_buffer/common/command_buffer_shared_test.cc
+++ b/gpu/command_buffer/common/command_buffer_shared_test.cc
@@ -14,8 +14,7 @@
 
 class CommandBufferSharedTest : public testing::Test {
  protected:
-
-  virtual void SetUp() {
+  void SetUp() override {
     shared_state_.reset(new CommandBufferSharedState());
     shared_state_->Initialize();
   }
diff --git a/gpu/command_buffer/common/debug_marker_manager_unittest.cc b/gpu/command_buffer/common/debug_marker_manager_unittest.cc
index fa1cfcc..7852c77 100644
--- a/gpu/command_buffer/common/debug_marker_manager_unittest.cc
+++ b/gpu/command_buffer/common/debug_marker_manager_unittest.cc
@@ -11,11 +11,9 @@
 
 class DebugMarkerManagerTest : public testing::Test {
  protected:
-  virtual void SetUp() {
-  }
+  void SetUp() override {}
 
-  virtual void TearDown() {
-  }
+  void TearDown() override {}
 
   DebugMarkerManager manager_;
 };
diff --git a/gpu/command_buffer/common/gles2_cmd_format_test.cc b/gpu/command_buffer/common/gles2_cmd_format_test.cc
index 717e6fb..ea683a6 100644
--- a/gpu/command_buffer/common/gles2_cmd_format_test.cc
+++ b/gpu/command_buffer/common/gles2_cmd_format_test.cc
@@ -19,12 +19,9 @@
  protected:
   static const unsigned char kInitialValue = 0xBD;
 
-  virtual void SetUp() {
-    memset(buffer_, kInitialValue, sizeof(buffer_));
-  }
+  void SetUp() override { memset(buffer_, kInitialValue, sizeof(buffer_)); }
 
-  virtual void TearDown() {
-  }
+  void TearDown() override {}
 
   template <typename T>
   T* GetBufferAs() {
diff --git a/gpu/command_buffer/common/id_allocator_test.cc b/gpu/command_buffer/common/id_allocator_test.cc
index 5d32e40..adeed5b 100644
--- a/gpu/command_buffer/common/id_allocator_test.cc
+++ b/gpu/command_buffer/common/id_allocator_test.cc
@@ -11,8 +11,8 @@
 
 class IdAllocatorTest : public testing::Test {
  protected:
-  virtual void SetUp() {}
-  virtual void TearDown() {}
+  void SetUp() override {}
+  void TearDown() override {}
 
   IdAllocator* id_allocator() { return &id_allocator_; }
 
diff --git a/gpu/command_buffer/service/async_pixel_transfer_manager_egl.cc b/gpu/command_buffer/service/async_pixel_transfer_manager_egl.cc
index 1e4066f..34e3a37 100644
--- a/gpu/command_buffer/service/async_pixel_transfer_manager_egl.cc
+++ b/gpu/command_buffer/service/async_pixel_transfer_manager_egl.cc
@@ -93,11 +93,9 @@
     SetPriority(base::kThreadPriority_Background);
 #endif
   }
-  virtual ~TransferThread() {
-    Stop();
-  }
+  ~TransferThread() override { Stop(); }
 
-  virtual void Init() override {
+  void Init() override {
     gfx::GLShareGroup* share_group = NULL;
     surface_ = new gfx::PbufferGLSurfaceEGL(gfx::Size(1, 1));
     surface_->Initialize();
@@ -107,7 +105,7 @@
     DCHECK(is_current);
   }
 
-  virtual void CleanUp() override {
+  void CleanUp() override {
     surface_ = NULL;
     context_->ReleaseCurrent(surface_.get());
     context_ = NULL;
@@ -401,20 +399,18 @@
       AsyncPixelTransferManagerEGL::SharedState* shared_state,
       GLuint texture_id,
       const AsyncTexImage2DParams& define_params);
-  virtual ~AsyncPixelTransferDelegateEGL();
+  ~AsyncPixelTransferDelegateEGL() override;
 
   void BindTransfer() { state_->BindTransfer(); }
 
   // Implement AsyncPixelTransferDelegate:
-  virtual void AsyncTexImage2D(
-      const AsyncTexImage2DParams& tex_params,
-      const AsyncMemoryParams& mem_params,
-      const base::Closure& bind_callback) override;
-  virtual void AsyncTexSubImage2D(
-      const AsyncTexSubImage2DParams& tex_params,
-      const AsyncMemoryParams& mem_params) override;
-  virtual bool TransferIsInProgress() override;
-  virtual void WaitForTransferCompletion() override;
+  void AsyncTexImage2D(const AsyncTexImage2DParams& tex_params,
+                       const AsyncMemoryParams& mem_params,
+                       const base::Closure& bind_callback) override;
+  void AsyncTexSubImage2D(const AsyncTexSubImage2DParams& tex_params,
+                          const AsyncMemoryParams& mem_params) override;
+  bool TransferIsInProgress() override;
+  void WaitForTransferCompletion() override;
 
  private:
   // Returns true if a work-around was used.
diff --git a/gpu/command_buffer/service/async_pixel_transfer_manager_egl.h b/gpu/command_buffer/service/async_pixel_transfer_manager_egl.h
index dc6798b..0b74216 100644
--- a/gpu/command_buffer/service/async_pixel_transfer_manager_egl.h
+++ b/gpu/command_buffer/service/async_pixel_transfer_manager_egl.h
@@ -16,18 +16,18 @@
 class AsyncPixelTransferManagerEGL : public AsyncPixelTransferManager {
  public:
   AsyncPixelTransferManagerEGL();
-  virtual ~AsyncPixelTransferManagerEGL();
+  ~AsyncPixelTransferManagerEGL() override;
 
   // AsyncPixelTransferManager implementation:
-  virtual void BindCompletedAsyncTransfers() override;
-  virtual void AsyncNotifyCompletion(
+  void BindCompletedAsyncTransfers() override;
+  void AsyncNotifyCompletion(
       const AsyncMemoryParams& mem_params,
       AsyncPixelTransferCompletionObserver* observer) override;
-  virtual uint32 GetTextureUploadCount() override;
-  virtual base::TimeDelta GetTotalTextureUploadTime() override;
-  virtual void ProcessMorePendingTransfers() override;
-  virtual bool NeedsProcessMorePendingTransfers() override;
-  virtual void WaitAllAsyncTexImage2D() override;
+  uint32 GetTextureUploadCount() override;
+  base::TimeDelta GetTotalTextureUploadTime() override;
+  void ProcessMorePendingTransfers() override;
+  bool NeedsProcessMorePendingTransfers() override;
+  void WaitAllAsyncTexImage2D() override;
 
   // State shared between Managers and Delegates.
   struct SharedState {
@@ -44,7 +44,7 @@
 
  private:
   // AsyncPixelTransferManager implementation:
-  virtual AsyncPixelTransferDelegate* CreatePixelTransferDelegateImpl(
+  AsyncPixelTransferDelegate* CreatePixelTransferDelegateImpl(
       gles2::TextureRef* ref,
       const AsyncTexImage2DParams& define_params) override;
 
diff --git a/gpu/command_buffer/service/buffer_manager_unittest.cc b/gpu/command_buffer/service/buffer_manager_unittest.cc
index 77f32dc..5c24eb0 100644
--- a/gpu/command_buffer/service/buffer_manager_unittest.cc
+++ b/gpu/command_buffer/service/buffer_manager_unittest.cc
@@ -33,7 +33,7 @@
     manager_.reset(new BufferManager(memory_tracker, feature_info));
   }
 
-  virtual void TearDown() {
+  void TearDown() override {
     manager_->Destroy(false);
     manager_.reset();
     error_state_.reset();
@@ -78,14 +78,12 @@
 
 class BufferManagerTest : public BufferManagerTestBase {
  protected:
-  virtual void SetUp() {
-    SetUpBase(NULL, NULL, "");
-  }
+  void SetUp() override { SetUpBase(NULL, NULL, ""); }
 };
 
 class BufferManagerMemoryTrackerTest : public BufferManagerTestBase {
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     mock_memory_tracker_ = new StrictMock<MockMemoryTracker>();
     SetUpBase(mock_memory_tracker_.get(), NULL, "");
   }
@@ -95,7 +93,7 @@
 
 class BufferManagerClientSideArraysTest : public BufferManagerTestBase {
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     feature_info_ = new FeatureInfo();
     feature_info_->workarounds_.use_client_side_arrays_for_stream_buffers =
       true;
diff --git a/gpu/command_buffer/service/command_buffer_service_unittest.cc b/gpu/command_buffer/service/command_buffer_service_unittest.cc
index 229aafa..3af2d05 100644
--- a/gpu/command_buffer/service/command_buffer_service_unittest.cc
+++ b/gpu/command_buffer/service/command_buffer_service_unittest.cc
@@ -22,7 +22,7 @@
 
 class CommandBufferServiceTest : public testing::Test {
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     {
       TransferBufferManager* manager = new TransferBufferManager();
       transfer_buffer_manager_.reset(manager);
diff --git a/gpu/command_buffer/service/common_decoder_unittest.cc b/gpu/command_buffer/service/common_decoder_unittest.cc
index aa1ed1b..5be7eea 100644
--- a/gpu/command_buffer/service/common_decoder_unittest.cc
+++ b/gpu/command_buffer/service/common_decoder_unittest.cc
@@ -151,12 +151,9 @@
 
 class CommonDecoderTest : public testing::Test {
  protected:
-  virtual void SetUp() {
-    decoder_.set_engine(&engine_);
-  }
+  void SetUp() override { decoder_.set_engine(&engine_); }
 
-  virtual void TearDown() {
-  }
+  void TearDown() override {}
 
   template <typename T>
   error::Error ExecuteCmd(const T& cmd) {
diff --git a/gpu/command_buffer/service/context_group_unittest.cc b/gpu/command_buffer/service/context_group_unittest.cc
index 7aa1301..13e5dc8 100644
--- a/gpu/command_buffer/service/context_group_unittest.cc
+++ b/gpu/command_buffer/service/context_group_unittest.cc
@@ -35,7 +35,7 @@
   ContextGroupTest() {}
 
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     GpuServiceTest::SetUp();
     decoder_.reset(new MockGLES2Decoder());
     group_ = scoped_refptr<ContextGroup>(
diff --git a/gpu/command_buffer/service/feature_info.cc b/gpu/command_buffer/service/feature_info.cc
index a21f630..9be747d 100644
--- a/gpu/command_buffer/service/feature_info.cc
+++ b/gpu/command_buffer/service/feature_info.cc
@@ -144,7 +144,6 @@
       angle_texture_usage(false),
       ext_texture_storage(false),
       chromium_path_rendering(false),
-      ext_blend_minmax(false),
       blend_equation_advanced(false),
       blend_equation_advanced_coherent(false) {
 }
@@ -820,7 +819,6 @@
 
   if (is_es3 || extensions.Contains("GL_EXT_blend_minmax") ||
       gfx::HasDesktopGLFeatures()) {
-    feature_flags_.ext_blend_minmax = true;
     AddExtensionString("GL_EXT_blend_minmax");
     validators_.equation.AddValue(GL_MIN_EXT);
     validators_.equation.AddValue(GL_MAX_EXT);
diff --git a/gpu/command_buffer/service/feature_info.h b/gpu/command_buffer/service/feature_info.h
index 0bc00a0..b69f2e4 100644
--- a/gpu/command_buffer/service/feature_info.h
+++ b/gpu/command_buffer/service/feature_info.h
@@ -71,7 +71,6 @@
     bool angle_texture_usage;
     bool ext_texture_storage;
     bool chromium_path_rendering;
-    bool ext_blend_minmax;
     bool blend_equation_advanced;
     bool blend_equation_advanced_coherent;
   };
diff --git a/gpu/command_buffer/service/feature_info_unittest.cc b/gpu/command_buffer/service/feature_info_unittest.cc
index a97188f..69bd4d3 100644
--- a/gpu/command_buffer/service/feature_info_unittest.cc
+++ b/gpu/command_buffer/service/feature_info_unittest.cc
@@ -74,11 +74,11 @@
   }
 
  protected:
-  virtual void SetUp() override {
+  void SetUp() override {
     // Do nothing here, since we are using the explicit Setup*() functions.
   }
 
-  virtual void TearDown() override {
+  void TearDown() override {
     info_ = NULL;
     GpuServiceTest::TearDown();
   }
diff --git a/gpu/command_buffer/service/framebuffer_manager_unittest.cc b/gpu/command_buffer/service/framebuffer_manager_unittest.cc
index 1ded558..88567b7 100644
--- a/gpu/command_buffer/service/framebuffer_manager_unittest.cc
+++ b/gpu/command_buffer/service/framebuffer_manager_unittest.cc
@@ -43,7 +43,7 @@
                               kMaxRenderbufferSize,
                               kMaxSamples,
                               kDepth24Supported) {}
-  virtual ~FramebufferManagerTest() {
+  ~FramebufferManagerTest() override {
     manager_.Destroy(false);
     texture_manager_.Destroy(false);
     renderbuffer_manager_.Destroy(false);
@@ -116,16 +116,14 @@
                                               kMaxCubemapSize,
                                               kUseDefaultTextures));
   }
-  virtual ~FramebufferInfoTest() {
+  ~FramebufferInfoTest() override {
     manager_.Destroy(false);
     texture_manager_->Destroy(false);
     renderbuffer_manager_.Destroy(false);
   }
 
  protected:
-  virtual void SetUp() {
-    InitializeContext("", "");
-  }
+  void SetUp() override { InitializeContext("", ""); }
 
   void InitializeContext(const char* gl_version, const char* extensions) {
     GpuServiceTest::SetUp();
@@ -673,11 +671,10 @@
   FramebufferInfoFloatTest()
     : FramebufferInfoTest() {
   }
-  virtual ~FramebufferInfoFloatTest() {
-  }
+  ~FramebufferInfoFloatTest() override {}
 
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     InitializeContext("OpenGL ES 3.0",
         "GL_OES_texture_float GL_EXT_color_buffer_float");
   }
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index ea5fbdd..baa51b8 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -2741,7 +2741,6 @@
   caps.post_sub_buffer = supports_post_sub_buffer_;
   caps.image = true;
 
-  caps.blend_minmax = feature_info_->feature_flags().ext_blend_minmax;
   caps.blend_equation_advanced =
       feature_info_->feature_flags().blend_equation_advanced;
   caps.blend_equation_advanced_coherent =
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest.h b/gpu/command_buffer/service/gles2_cmd_decoder_unittest.h
index fea20ab..0ea7d4b 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest.h
@@ -57,7 +57,7 @@
  public:
   GLES2DecoderRGBBackbufferTest() {}
 
-  virtual void SetUp();
+  void SetUp() override;
 };
 
 class GLES2DecoderManualInitTest : public GLES2DecoderWithShaderTest {
@@ -65,7 +65,7 @@
   GLES2DecoderManualInitTest() {}
 
   // Override default setup so nothing gets setup.
-  virtual void SetUp();
+  void SetUp() override;
 
   void DirtyStateMaskTest(GLuint color_bits,
                           bool depth_mask,
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_attribs.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_attribs.cc
index 36b14e5..a858cf7 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_attribs.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_attribs.cc
@@ -233,7 +233,7 @@
 
   bool vertex_array_deleted_manually_;
 
-  virtual void SetUp() {
+  void SetUp() override {
     InitState init;
     init.gl_version = "opengl es 2.0";
     init.bind_generates_resource = true;
@@ -246,7 +246,7 @@
     vertex_array_deleted_manually_ = false;
   }
 
-  virtual void TearDown() {
+  void TearDown() override {
     // This should only be set if the test handled deletion of the vertex array
     // itself. Necessary because vertex_array_objects are not sharable, and thus
     // not managed in the ContextGroup, meaning they will be destroyed during
@@ -355,7 +355,7 @@
  public:
   GLES2DecoderEmulatedVertexArraysOESTest() {}
 
-  virtual void SetUp() {
+  void SetUp() override {
     InitState init;
     init.gl_version = "3.0";
     init.bind_generates_resource = true;
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h
index 1e7db3f..1507440 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h
@@ -69,8 +69,8 @@
     engine_->ClearSharedMemory();
   }
 
-  virtual void SetUp() override;
-  virtual void TearDown() override;
+  void SetUp() override;
+  void TearDown() override;
 
   template <typename T>
   error::Error ExecuteCmd(const T& cmd) {
@@ -627,9 +627,8 @@
   }
 
  protected:
-  virtual void SetUp() override;
-  virtual void TearDown() override;
-
+  void SetUp() override;
+  void TearDown() override;
 };
 
 // SpecializedSetup specializations that are needed in multiple unittest files.
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_drawing.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_drawing.cc
index 4ee12ff..0bfefd4 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_drawing.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_drawing.cc
@@ -57,7 +57,7 @@
  public:
   GLES2DecoderGeometryInstancingTest() : GLES2DecoderWithShaderTest() {}
 
-  virtual void SetUp() {
+  void SetUp() override {
     InitState init;
     init.extensions = "GL_ANGLE_instanced_arrays";
     init.gl_version = "opengl es 2.0";
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_extensions.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_extensions.cc
index ac80190..f87a4bd 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_extensions.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_extensions.cc
@@ -19,7 +19,7 @@
 class GLES2DecoderTestWithCHROMIUMPathRendering : public GLES2DecoderTest {
  public:
   GLES2DecoderTestWithCHROMIUMPathRendering() {}
-  virtual void SetUp() override {
+  void SetUp() override {
     InitState init;
     init.gl_version = "opengl es 3.1";
     init.has_alpha = true;
@@ -39,7 +39,7 @@
 class GLES2DecoderTestWithBlendEquationAdvanced : public GLES2DecoderTest {
  public:
   GLES2DecoderTestWithBlendEquationAdvanced() {}
-  virtual void SetUp() override {
+  void SetUp() override {
     InitState init;
     init.gl_version = "opengl es 2.0";
     init.has_alpha = true;
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_framebuffers.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_framebuffers.cc
index ce8f307..d555f28 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_framebuffers.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_framebuffers.cc
@@ -57,7 +57,7 @@
  public:
   GLES2DecoderTestWithExtensionsOnGLES2() {}
 
-  virtual void SetUp() {}
+  void SetUp() override {}
   void Init(const char* extensions) {
     InitState init;
     init.extensions = extensions;
diff --git a/gpu/command_buffer/service/gpu_scheduler_unittest.cc b/gpu/command_buffer/service/gpu_scheduler_unittest.cc
index c658d2b..d8233ec 100644
--- a/gpu/command_buffer/service/gpu_scheduler_unittest.cc
+++ b/gpu/command_buffer/service/gpu_scheduler_unittest.cc
@@ -32,7 +32,7 @@
  protected:
   static const int32 kTransferBufferId = 123;
 
-  virtual void SetUp() {
+  void SetUp() override {
     scoped_ptr<base::SharedMemory> shared_memory(new ::base::SharedMemory);
     shared_memory->CreateAndMapAnonymous(kRingBufferSize);
     buffer_ = static_cast<int32*>(shared_memory->memory());
@@ -62,7 +62,7 @@
     EXPECT_TRUE(scheduler_->SetGetBuffer(kTransferBufferId));
   }
 
-  virtual void TearDown() {
+  void TearDown() override {
     // Ensure that any unexpected tasks posted by the GPU scheduler are executed
     // in order to fail the test.
     base::MessageLoop::current()->RunUntilIdle();
diff --git a/gpu/command_buffer/service/gpu_service_test.h b/gpu/command_buffer/service/gpu_service_test.h
index 189031c..539d6ba 100644
--- a/gpu/command_buffer/service/gpu_service_test.h
+++ b/gpu/command_buffer/service/gpu_service_test.h
@@ -22,12 +22,12 @@
 class GpuServiceTest : public testing::Test {
  public:
   GpuServiceTest();
-  virtual ~GpuServiceTest();
+  ~GpuServiceTest() override;
 
  protected:
   void SetUpWithGLVersion(const char* gl_version, const char* gl_extensions);
-  virtual void SetUp() override;
-  virtual void TearDown() override;
+  void SetUp() override;
+  void TearDown() override;
 
   scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_;
 
diff --git a/gpu/command_buffer/service/gpu_tracer_unittest.cc b/gpu/command_buffer/service/gpu_tracer_unittest.cc
index fe353c3..59ea63e 100644
--- a/gpu/command_buffer/service/gpu_tracer_unittest.cc
+++ b/gpu/command_buffer/service/gpu_tracer_unittest.cc
@@ -163,12 +163,12 @@
   }
 
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     GpuServiceTest::SetUp();
     gl_fake_queries_.Reset();
   }
 
-  virtual void TearDown() {
+  void TearDown() override {
     gl_.reset();
     gl_fake_queries_.Reset();
     GpuServiceTest::TearDown();
diff --git a/gpu/command_buffer/service/id_manager_unittest.cc b/gpu/command_buffer/service/id_manager_unittest.cc
index 015a442..9a6e567 100644
--- a/gpu/command_buffer/service/id_manager_unittest.cc
+++ b/gpu/command_buffer/service/id_manager_unittest.cc
@@ -14,11 +14,9 @@
   }
 
  protected:
-  virtual void SetUp() {
-  }
+  void SetUp() override {}
 
-  virtual void TearDown() {
-  }
+  void TearDown() override {}
 
   IdManager manager_;
 };
diff --git a/gpu/command_buffer/service/mailbox_manager_unittest.cc b/gpu/command_buffer/service/mailbox_manager_unittest.cc
index 1aea4c5..231193f 100644
--- a/gpu/command_buffer/service/mailbox_manager_unittest.cc
+++ b/gpu/command_buffer/service/mailbox_manager_unittest.cc
@@ -20,10 +20,10 @@
 class MailboxManagerTest : public GpuServiceTest {
  public:
   MailboxManagerTest() {}
-  virtual ~MailboxManagerTest() {}
+  ~MailboxManagerTest() override {}
 
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     GpuServiceTest::SetUp();
     feature_info_ = new FeatureInfo;
     manager_ = new MailboxManagerImpl;
@@ -37,9 +37,7 @@
     DCHECK(manager_->UsesSync());
   }
 
-  virtual void TearDown() {
-    GpuServiceTest::TearDown();
-  }
+  void TearDown() override { GpuServiceTest::TearDown(); }
 
   Texture* CreateTexture() {
     return new Texture(1);
@@ -190,10 +188,10 @@
 class MailboxManagerSyncTest : public MailboxManagerTest {
  public:
   MailboxManagerSyncTest() {}
-  virtual ~MailboxManagerSyncTest() {}
+  ~MailboxManagerSyncTest() override {}
 
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     MailboxManagerTest::SetUpWithSynchronizer();
     manager2_ = new MailboxManagerSync();
     context_ = new gfx::GLContextStub();
@@ -257,7 +255,7 @@
         .RetiresOnSaturation();
   }
 
-  virtual void TearDown() {
+  void TearDown() override {
     context_->ReleaseCurrent(NULL);
     MailboxManagerTest::TearDown();
   }
diff --git a/gpu/command_buffer/service/memory_program_cache_unittest.cc b/gpu/command_buffer/service/memory_program_cache_unittest.cc
index 4ff3fe3..d3e954e 100644
--- a/gpu/command_buffer/service/memory_program_cache_unittest.cc
+++ b/gpu/command_buffer/service/memory_program_cache_unittest.cc
@@ -76,9 +76,7 @@
         vertex_shader_(NULL),
         fragment_shader_(NULL),
         shader_cache_count_(0) { }
-  virtual ~MemoryProgramCacheTest() {
-    shader_manager_.Destroy(false);
-  }
+  ~MemoryProgramCacheTest() override { shader_manager_.Destroy(false); }
 
   void ShaderCacheCb(const std::string& key, const std::string& shader) {
     shader_cache_count_++;
@@ -89,7 +87,7 @@
   const std::string& shader_cache_shader() { return shader_cache_shader_; }
 
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     GpuServiceTest::SetUp();
 
     vertex_shader_ = shader_manager_.CreateShader(kVertexShaderClientId,
diff --git a/gpu/command_buffer/service/program_manager_unittest.cc b/gpu/command_buffer/service/program_manager_unittest.cc
index 5d80694..4acd220 100644
--- a/gpu/command_buffer/service/program_manager_unittest.cc
+++ b/gpu/command_buffer/service/program_manager_unittest.cc
@@ -43,9 +43,7 @@
 class ProgramManagerTest : public GpuServiceTest {
  public:
   ProgramManagerTest() : manager_(NULL, kMaxVaryingVectors) { }
-  virtual ~ProgramManagerTest() {
-    manager_.Destroy(false);
-  }
+  ~ProgramManagerTest() override { manager_.Destroy(false); }
 
  protected:
   ProgramManager manager_;
@@ -131,7 +129,7 @@
       :  manager_(NULL, kMaxVaryingVectors), program_(NULL) {
   }
 
-  virtual ~ProgramManagerWithShaderTest() {
+  ~ProgramManagerWithShaderTest() override {
     manager_.Destroy(false);
     shader_manager_.Destroy(false);
   }
@@ -172,9 +170,9 @@
   static const GLint kUniform1Size = 1;
   static const GLint kUniform2Size = 3;
   static const GLint kUniform3Size = 2;
-  static const int kUniform1Precision = SH_PRECISION_LOWP;
-  static const int kUniform2Precision = SH_PRECISION_MEDIUMP;
-  static const int kUniform3Precision = SH_PRECISION_HIGHP;
+  static const int kUniform1Precision = GL_LOW_FLOAT;
+  static const int kUniform2Precision = GL_MEDIUM_INT;
+  static const int kUniform3Precision = GL_HIGH_FLOAT;
   static const int kUniform1StaticUse = 1;
   static const int kUniform2StaticUse = 1;
   static const int kUniform3StaticUse = 1;
@@ -215,7 +213,7 @@
     VarCategory category;
   } VarInfo;
 
-  virtual void SetUp() {
+  void SetUp() override {
     GpuServiceTest::SetUp();
 
     SetupDefaultShaderExpectations();
@@ -1130,7 +1128,7 @@
     attrib_map[kAttribs[ii].name] = TestHelper::ConstructAttribute(
         kAttribs[ii].type,
         kAttribs[ii].size,
-        SH_PRECISION_MEDIUMP,
+        GL_MEDIUM_FLOAT,
         kAttribStaticUse,
         kAttribs[ii].name);
   }
@@ -1138,7 +1136,7 @@
   attrib_map[kAttribMatName] = TestHelper::ConstructAttribute(
       GL_FLOAT_MAT2,
       1,
-      SH_PRECISION_MEDIUMP,
+      GL_MEDIUM_FLOAT,
       kAttribStaticUse,
       kAttribMatName);
   // Check we can create shader.
@@ -1579,13 +1577,13 @@
         fragment_shader_(NULL),
         program_(NULL) {
   }
-  virtual ~ProgramManagerWithCacheTest() {
+  ~ProgramManagerWithCacheTest() override {
     manager_.Destroy(false);
     shader_manager_.Destroy(false);
   }
 
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     GpuServiceTest::SetUp();
 
     vertex_shader_ = shader_manager_.CreateShader(
diff --git a/gpu/command_buffer/service/query_manager_unittest.cc b/gpu/command_buffer/service/query_manager_unittest.cc
index b4f1653..80efd69 100644
--- a/gpu/command_buffer/service/query_manager_unittest.cc
+++ b/gpu/command_buffer/service/query_manager_unittest.cc
@@ -34,11 +34,10 @@
 
   QueryManagerTest() {
   }
-  virtual ~QueryManagerTest() {
-  }
+  ~QueryManagerTest() override {}
 
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     GpuServiceTest::SetUp();
     engine_.reset(new MockCommandBufferEngine());
     decoder_.reset(new MockGLES2Decoder());
@@ -51,7 +50,7 @@
     manager_.reset(new QueryManager(decoder_.get(), feature_info.get()));
   }
 
-  virtual void TearDown() {
+  void TearDown() override {
     decoder_.reset();
     manager_->Destroy(false);
     manager_.reset();
diff --git a/gpu/command_buffer/service/renderbuffer_manager_unittest.cc b/gpu/command_buffer/service/renderbuffer_manager_unittest.cc
index ba0ebea..7c625e6 100644
--- a/gpu/command_buffer/service/renderbuffer_manager_unittest.cc
+++ b/gpu/command_buffer/service/renderbuffer_manager_unittest.cc
@@ -29,7 +29,7 @@
         memory_tracker, kMaxSize, kMaxSamples, depth24_supported));
   }
 
-  virtual void TearDown() {
+  void TearDown() override {
     manager_->Destroy(true);
     manager_.reset();
     GpuServiceTest::TearDown();
@@ -40,7 +40,7 @@
 
 class RenderbufferManagerTest : public RenderbufferManagerTestBase {
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     bool depth24_supported = false;
     SetUpBase(NULL, depth24_supported);
   }
@@ -49,7 +49,7 @@
 class RenderbufferManagerMemoryTrackerTest
     : public RenderbufferManagerTestBase {
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     mock_memory_tracker_ = new StrictMock<MockMemoryTracker>();
     bool depth24_supported = false;
     SetUpBase(mock_memory_tracker_.get(), depth24_supported);
@@ -293,7 +293,7 @@
 
 class RenderbufferManagerFormatTest : public RenderbufferManagerTestBase {
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     bool depth24_supported = true;
     SetUpBase(NULL, depth24_supported);
   }
diff --git a/gpu/command_buffer/service/shader_manager_unittest.cc b/gpu/command_buffer/service/shader_manager_unittest.cc
index 717572b..4218d50 100644
--- a/gpu/command_buffer/service/shader_manager_unittest.cc
+++ b/gpu/command_buffer/service/shader_manager_unittest.cc
@@ -22,9 +22,7 @@
   ShaderManagerTest() {
   }
 
-  virtual ~ShaderManagerTest() {
-    manager_.Destroy(false);
-  }
+  ~ShaderManagerTest() override { manager_.Destroy(false); }
 
  protected:
   ShaderManager manager_;
diff --git a/gpu/command_buffer/service/shader_translator_unittest.cc b/gpu/command_buffer/service/shader_translator_unittest.cc
index 40d5be7..16c80a2 100644
--- a/gpu/command_buffer/service/shader_translator_unittest.cc
+++ b/gpu/command_buffer/service/shader_translator_unittest.cc
@@ -15,11 +15,10 @@
   ShaderTranslatorTest() {
   }
 
-  virtual ~ShaderTranslatorTest() {
-  }
+  ~ShaderTranslatorTest() override {}
 
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     ShBuiltInResources resources;
     ShInitBuiltInResources(&resources);
     resources.MaxExpressionComplexity = 32;
@@ -37,7 +36,7 @@
         ShaderTranslatorInterface::kGlsl,
         static_cast<ShCompileOptions>(0)));
   }
-  virtual void TearDown() {
+  void TearDown() override {
     vertex_translator_ = NULL;
     fragment_translator_ = NULL;
   }
diff --git a/gpu/command_buffer/service/texture_definition.cc b/gpu/command_buffer/service/texture_definition.cc
index b0cafe2..edd4271 100644
--- a/gpu/command_buffer/service/texture_definition.cc
+++ b/gpu/command_buffer/service/texture_definition.cc
@@ -114,11 +114,11 @@
 
  private:
   NativeImageBufferEGL(EGLDisplay display, EGLImageKHR image);
-  virtual ~NativeImageBufferEGL();
-  virtual void AddClient(gfx::GLImage* client) override;
-  virtual void RemoveClient(gfx::GLImage* client) override;
-  virtual bool IsClient(gfx::GLImage* client) override;
-  virtual void BindToTexture(GLenum target) override;
+  ~NativeImageBufferEGL() override;
+  void AddClient(gfx::GLImage* client) override;
+  void RemoveClient(gfx::GLImage* client) override;
+  bool IsClient(gfx::GLImage* client) override;
+  void BindToTexture(GLenum target) override;
 
   EGLDisplay egl_display_;
   EGLImageKHR egl_image_;
diff --git a/gpu/command_buffer/service/texture_manager_unittest.cc b/gpu/command_buffer/service/texture_manager_unittest.cc
index 157138f..3278b4e 100644
--- a/gpu/command_buffer/service/texture_manager_unittest.cc
+++ b/gpu/command_buffer/service/texture_manager_unittest.cc
@@ -55,11 +55,10 @@
 
   TextureManagerTest() : feature_info_(new FeatureInfo()) {}
 
-  virtual ~TextureManagerTest() {
-  }
+  ~TextureManagerTest() override {}
 
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     GpuServiceTest::SetUp();
     manager_.reset(new TextureManager(NULL,
                                       feature_info_.get(),
@@ -72,7 +71,7 @@
     error_state_.reset(new ::testing::StrictMock<gles2::MockErrorState>());
   }
 
-  virtual void TearDown() {
+  void TearDown() override {
     manager_->Destroy(false);
     manager_.reset();
     GpuServiceTest::TearDown();
@@ -397,9 +396,7 @@
   TextureTestBase()
       : feature_info_(new FeatureInfo()) {
   }
-  virtual ~TextureTestBase() {
-    texture_ref_ = NULL;
-  }
+  ~TextureTestBase() override { texture_ref_ = NULL; }
 
  protected:
   void SetUpBase(MemoryTracker* memory_tracker, std::string extensions) {
@@ -422,7 +419,7 @@
     ASSERT_TRUE(texture_ref_.get() != NULL);
   }
 
-  virtual void TearDown() {
+  void TearDown() override {
     if (texture_ref_.get()) {
       // If it's not in the manager then setting texture_ref_ to NULL will
       // delete the texture.
@@ -456,14 +453,12 @@
 
 class TextureTest : public TextureTestBase {
  protected:
-  virtual void SetUp() {
-    SetUpBase(NULL, std::string());
-  }
+  void SetUp() override { SetUpBase(NULL, std::string()); }
 };
 
 class TextureMemoryTrackerTest : public TextureTestBase {
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     mock_memory_tracker_ = new StrictMock<MockMemoryTracker>();
     SetUpBase(mock_memory_tracker_.get(), std::string());
   }
@@ -1871,7 +1866,7 @@
 class ProduceConsumeTextureTest : public TextureTest,
                                   public ::testing::WithParamInterface<GLenum> {
  public:
-  virtual void SetUp() {
+  void SetUp() override {
     TextureTest::SetUpBase(NULL, "GL_OES_EGL_image_external");
     manager_->CreateTexture(kClient2Id, kService2Id);
     texture2_ = manager_->GetTexture(kClient2Id);
@@ -1880,7 +1875,7 @@
       .WillRepeatedly(Return(error_state_.get()));
   }
 
-  virtual void TearDown() {
+  void TearDown() override {
     if (texture2_.get()) {
       // If it's not in the manager then setting texture2_ to NULL will
       // delete the texture.
@@ -2194,10 +2189,9 @@
 
   SharedTextureTest() : feature_info_(new FeatureInfo()) {}
 
-  virtual ~SharedTextureTest() {
-  }
+  ~SharedTextureTest() override {}
 
-  virtual void SetUp() {
+  void SetUp() override {
     GpuServiceTest::SetUp();
     memory_tracker1_ = new CountingMemoryTracker;
     texture_manager1_.reset(
@@ -2221,7 +2215,7 @@
     texture_manager2_->Initialize();
   }
 
-  virtual void TearDown() {
+  void TearDown() override {
     texture_manager2_->Destroy(false);
     texture_manager2_.reset();
     texture_manager1_->Destroy(false);
diff --git a/gpu/command_buffer/service/transfer_buffer_manager_unittest.cc b/gpu/command_buffer/service/transfer_buffer_manager_unittest.cc
index 563b6cb..6f35601 100644
--- a/gpu/command_buffer/service/transfer_buffer_manager_unittest.cc
+++ b/gpu/command_buffer/service/transfer_buffer_manager_unittest.cc
@@ -16,7 +16,7 @@
 
 class TransferBufferManagerTest : public testing::Test {
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     TransferBufferManager* manager = new TransferBufferManager();
     transfer_buffer_manager_.reset(manager);
     ASSERT_TRUE(manager->Initialize());
diff --git a/gpu/command_buffer/service/vertex_array_manager_unittest.cc b/gpu/command_buffer/service/vertex_array_manager_unittest.cc
index aa2df35..24592b6 100644
--- a/gpu/command_buffer/service/vertex_array_manager_unittest.cc
+++ b/gpu/command_buffer/service/vertex_array_manager_unittest.cc
@@ -25,16 +25,15 @@
   VertexArrayManagerTest() {
   }
 
-  virtual ~VertexArrayManagerTest() {
-  }
+  ~VertexArrayManagerTest() override {}
 
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     GpuServiceTest::SetUp();
     manager_.reset(new VertexArrayManager());
   }
 
-  virtual void TearDown() {
+  void TearDown() override {
     manager_.reset();
     GpuServiceTest::TearDown();
   }
diff --git a/gpu/command_buffer/service/vertex_attrib_manager_unittest.cc b/gpu/command_buffer/service/vertex_attrib_manager_unittest.cc
index e7fd690..b82858e 100644
--- a/gpu/command_buffer/service/vertex_attrib_manager_unittest.cc
+++ b/gpu/command_buffer/service/vertex_attrib_manager_unittest.cc
@@ -26,11 +26,10 @@
   VertexAttribManagerTest() {
   }
 
-  virtual ~VertexAttribManagerTest() {
-  }
+  ~VertexAttribManagerTest() override {}
 
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     GpuServiceTest::SetUp();
 
     for (uint32 ii = 0; ii < kNumVertexAttribs; ++ii) {
diff --git a/gpu/command_buffer/tests/compressed_texture_test.cc b/gpu/command_buffer/tests/compressed_texture_test.cc
index 8c214b2..754e2d4 100644
--- a/gpu/command_buffer/tests/compressed_texture_test.cc
+++ b/gpu/command_buffer/tests/compressed_texture_test.cc
@@ -148,15 +148,13 @@
 
 class CompressedTextureTest : public ::testing::TestWithParam<GLenum> {
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     GLManager::Options options;
     options.size = gfx::Size(kTextureWidth, kTextureHeight);
     gl_.Initialize(options);
   }
 
-  virtual void TearDown() {
-    gl_.Destroy();
-  }
+  void TearDown() override { gl_.Destroy(); }
 
   GLuint LoadProgram() {
     const char* v_shader_src = SHADER(
diff --git a/gpu/command_buffer/tests/gl_bind_uniform_location_unittest.cc b/gpu/command_buffer/tests/gl_bind_uniform_location_unittest.cc
index c313273..81e2435 100644
--- a/gpu/command_buffer/tests/gl_bind_uniform_location_unittest.cc
+++ b/gpu/command_buffer/tests/gl_bind_uniform_location_unittest.cc
@@ -18,15 +18,13 @@
 class BindUniformLocationTest : public testing::Test {
  protected:
   static const GLsizei kResolution = 4;
-  virtual void SetUp() {
+  void SetUp() override {
     GLManager::Options options;
     options.size = gfx::Size(kResolution, kResolution);
     gl_.Initialize(options);
   }
 
-  virtual void TearDown() {
-    gl_.Destroy();
-  }
+  void TearDown() override { gl_.Destroy(); }
 
   GLManager gl_;
 };
diff --git a/gpu/command_buffer/tests/gl_chromium_framebuffer_multisample_unittest.cc b/gpu/command_buffer/tests/gl_chromium_framebuffer_multisample_unittest.cc
index fe61d51..9d36a26 100644
--- a/gpu/command_buffer/tests/gl_chromium_framebuffer_multisample_unittest.cc
+++ b/gpu/command_buffer/tests/gl_chromium_framebuffer_multisample_unittest.cc
@@ -15,13 +15,9 @@
 
 class GLChromiumFramebufferMultisampleTest : public testing::Test {
  protected:
-  virtual void SetUp() {
-    gl_.Initialize(GLManager::Options());
-  }
+  void SetUp() override { gl_.Initialize(GLManager::Options()); }
 
-  virtual void TearDown() {
-    gl_.Destroy();
-  }
+  void TearDown() override { gl_.Destroy(); }
 
   GLManager gl_;
 };
diff --git a/gpu/command_buffer/tests/gl_chromium_path_rendering_unittest.cc b/gpu/command_buffer/tests/gl_chromium_path_rendering_unittest.cc
index 1d90053..0d17b7c 100644
--- a/gpu/command_buffer/tests/gl_chromium_path_rendering_unittest.cc
+++ b/gpu/command_buffer/tests/gl_chromium_path_rendering_unittest.cc
@@ -19,13 +19,13 @@
   static const GLsizei kResolution = 100;
 
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     GLManager::Options options;
     options.size = gfx::Size(kResolution, kResolution);
     gl_.Initialize(options);
   }
 
-  virtual void TearDown() { gl_.Destroy(); }
+  void TearDown() override { gl_.Destroy(); }
 
   void ExpectEqualMatrix(const GLfloat* expected, const GLfloat* actual) {
     for (size_t i = 0; i < 16; ++i) {
diff --git a/gpu/command_buffer/tests/gl_copy_texture_CHROMIUM_unittest.cc b/gpu/command_buffer/tests/gl_copy_texture_CHROMIUM_unittest.cc
index d03b121..2c44e1a 100644
--- a/gpu/command_buffer/tests/gl_copy_texture_CHROMIUM_unittest.cc
+++ b/gpu/command_buffer/tests/gl_copy_texture_CHROMIUM_unittest.cc
@@ -20,7 +20,7 @@
 // A collection of tests that exercise the GL_CHROMIUM_copy_texture extension.
 class GLCopyTextureCHROMIUMTest : public testing::Test {
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     gl_.Initialize(GLManager::Options());
 
     glGenTextures(2, textures_);
@@ -39,7 +39,7 @@
                            textures_[1], 0);
   }
 
-  virtual void TearDown() {
+  void TearDown() override {
     glDeleteTextures(2, textures_);
     glDeleteFramebuffers(1, &framebuffer_id_);
     gl_.Destroy();
diff --git a/gpu/command_buffer/tests/gl_depth_texture_unittest.cc b/gpu/command_buffer/tests/gl_depth_texture_unittest.cc
index 83bb84c..5bbbb06 100644
--- a/gpu/command_buffer/tests/gl_depth_texture_unittest.cc
+++ b/gpu/command_buffer/tests/gl_depth_texture_unittest.cc
@@ -17,15 +17,13 @@
 class DepthTextureTest : public testing::Test {
  protected:
   static const GLsizei kResolution = 64;
-  virtual void SetUp() {
+  void SetUp() override {
     GLManager::Options options;
     options.size = gfx::Size(kResolution, kResolution);
     gl_.Initialize(options);
   }
 
-  virtual void TearDown() {
-    gl_.Destroy();
-  }
+  void TearDown() override { gl_.Destroy(); }
 
   GLuint SetupUnitQuad(GLint position_location);
 
diff --git a/gpu/command_buffer/tests/gl_gpu_memory_buffer_unittest.cc b/gpu/command_buffer/tests/gl_gpu_memory_buffer_unittest.cc
index 745ceb9..8430dfb 100644
--- a/gpu/command_buffer/tests/gl_gpu_memory_buffer_unittest.cc
+++ b/gpu/command_buffer/tests/gl_gpu_memory_buffer_unittest.cc
@@ -37,7 +37,7 @@
 
 class GpuMemoryBufferTest : public testing::Test {
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     gl_.Initialize(GLManager::Options());
     gl_.MakeCurrent();
 
@@ -58,7 +58,7 @@
                            0);
   }
 
-  virtual void TearDown() {
+  void TearDown() override {
     glDeleteTextures(2, texture_ids_);
     glDeleteFramebuffers(1, &framebuffer_id_);
 
diff --git a/gpu/command_buffer/tests/gl_lose_context_chromium_unittest.cc b/gpu/command_buffer/tests/gl_lose_context_chromium_unittest.cc
index 547c1ed..94381ac 100644
--- a/gpu/command_buffer/tests/gl_lose_context_chromium_unittest.cc
+++ b/gpu/command_buffer/tests/gl_lose_context_chromium_unittest.cc
@@ -17,7 +17,7 @@
 
 class GLLoseContextTest : public testing::Test {
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     GLManager::Options options;
     gl2_.Initialize(options);
     options.context_lost_allowed = true;
@@ -26,7 +26,7 @@
     gl1b_.Initialize(options);
   }
 
-  virtual void TearDown() {
+  void TearDown() override {
     gl1a_.Destroy();
     gl1b_.Destroy();
     gl2_.Destroy();
diff --git a/gpu/command_buffer/tests/gl_pointcoord_unittest.cc b/gpu/command_buffer/tests/gl_pointcoord_unittest.cc
index fe71eed..d9501b0 100644
--- a/gpu/command_buffer/tests/gl_pointcoord_unittest.cc
+++ b/gpu/command_buffer/tests/gl_pointcoord_unittest.cc
@@ -19,15 +19,13 @@
   static const GLsizei kResolution = 256;
 
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     GLManager::Options options;
     options.size = gfx::Size(kResolution, kResolution);
     gl_.Initialize(options);
   }
 
-  virtual void TearDown() {
-    gl_.Destroy();
-  }
+  void TearDown() override { gl_.Destroy(); }
 
   GLuint SetupQuad(GLint position_location, GLfloat pixel_offset);
 
diff --git a/gpu/command_buffer/tests/gl_program_unittest.cc b/gpu/command_buffer/tests/gl_program_unittest.cc
index b99aa58..aec95b2 100644
--- a/gpu/command_buffer/tests/gl_program_unittest.cc
+++ b/gpu/command_buffer/tests/gl_program_unittest.cc
@@ -16,13 +16,9 @@
 
 class GLProgramTest : public testing::Test {
  protected:
-  virtual void SetUp() {
-    gl_.Initialize(GLManager::Options());
-  }
+  void SetUp() override { gl_.Initialize(GLManager::Options()); }
 
-  virtual void TearDown() {
-    gl_.Destroy();
-  }
+  void TearDown() override { gl_.Destroy(); }
 
   GLManager gl_;
 };
diff --git a/gpu/command_buffer/tests/gl_query_unittest.cc b/gpu/command_buffer/tests/gl_query_unittest.cc
index 87235e5..0104430 100644
--- a/gpu/command_buffer/tests/gl_query_unittest.cc
+++ b/gpu/command_buffer/tests/gl_query_unittest.cc
@@ -16,13 +16,9 @@
 
 class QueryTest : public testing::Test {
  protected:
-  virtual void SetUp() {
-    gl_.Initialize(GLManager::Options());
-  }
+  void SetUp() override { gl_.Initialize(GLManager::Options()); }
 
-  virtual void TearDown() {
-    gl_.Destroy();
-  }
+  void TearDown() override { gl_.Destroy(); }
 
   GLManager gl_;
 };
diff --git a/gpu/command_buffer/tests/gl_readback_unittest.cc b/gpu/command_buffer/tests/gl_readback_unittest.cc
index e67cbdc..cbda25c 100644
--- a/gpu/command_buffer/tests/gl_readback_unittest.cc
+++ b/gpu/command_buffer/tests/gl_readback_unittest.cc
@@ -21,13 +21,9 @@
 
 class GLReadbackTest : public testing::Test {
  protected:
-  virtual void SetUp() {
-    gl_.Initialize(GLManager::Options());
-  }
+  void SetUp() override { gl_.Initialize(GLManager::Options()); }
 
-  virtual void TearDown() {
-    gl_.Destroy();
-  }
+  void TearDown() override { gl_.Destroy(); }
 
   static void WaitForQueryCallback(int q, base::Closure cb) {
     unsigned int done = 0;
diff --git a/gpu/command_buffer/tests/gl_shared_resources_unittest.cc b/gpu/command_buffer/tests/gl_shared_resources_unittest.cc
index 136b57a..0f7ffe8 100644
--- a/gpu/command_buffer/tests/gl_shared_resources_unittest.cc
+++ b/gpu/command_buffer/tests/gl_shared_resources_unittest.cc
@@ -15,7 +15,7 @@
 
 class GLSharedResources : public testing::Test {
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     GLManager::Options options;
     options.bind_generates_resource = true;
     gl1_.Initialize(options);
@@ -23,7 +23,7 @@
     gl2_.Initialize(options);
   }
 
-  virtual void TearDown() {
+  void TearDown() override {
     gl1_.Destroy();
     gl2_.Destroy();
   }
diff --git a/gpu/command_buffer/tests/gl_stream_draw_unittest.cc b/gpu/command_buffer/tests/gl_stream_draw_unittest.cc
index 7ccd48d..90968c8 100644
--- a/gpu/command_buffer/tests/gl_stream_draw_unittest.cc
+++ b/gpu/command_buffer/tests/gl_stream_draw_unittest.cc
@@ -19,15 +19,13 @@
  protected:
   static const int kSize = 4;
 
-  virtual void SetUp() {
+  void SetUp() override {
     GLManager::Options options;
     options.size = gfx::Size(kSize, kSize);
     gl_.Initialize(options);
   }
 
-  virtual void TearDown() {
-    gl_.Destroy();
-  }
+  void TearDown() override { gl_.Destroy(); }
 
   GLManager gl_;
 };
diff --git a/gpu/command_buffer/tests/gl_texture_mailbox_unittest.cc b/gpu/command_buffer/tests/gl_texture_mailbox_unittest.cc
index 1ce8303..3ceb5ff 100644
--- a/gpu/command_buffer/tests/gl_texture_mailbox_unittest.cc
+++ b/gpu/command_buffer/tests/gl_texture_mailbox_unittest.cc
@@ -54,14 +54,14 @@
 
 class GLTextureMailboxTest : public testing::Test {
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     gl1_.Initialize(GLManager::Options());
     GLManager::Options options;
     options.share_mailbox_manager = &gl1_;
     gl2_.Initialize(options);
   }
 
-  virtual void TearDown() {
+  void TearDown() override {
     gl1_.Destroy();
     gl2_.Destroy();
   }
diff --git a/gpu/command_buffer/tests/gl_texture_storage_unittest.cc b/gpu/command_buffer/tests/gl_texture_storage_unittest.cc
index b28baf0..1f14e28 100644
--- a/gpu/command_buffer/tests/gl_texture_storage_unittest.cc
+++ b/gpu/command_buffer/tests/gl_texture_storage_unittest.cc
@@ -15,7 +15,7 @@
 class TextureStorageTest : public testing::Test {
  protected:
   static const GLsizei kResolution = 64;
-  virtual void SetUp() {
+  void SetUp() override {
     GLManager::Options options;
     options.size = gfx::Size(kResolution, kResolution);
     gl_.Initialize(options);
@@ -37,9 +37,7 @@
         extensions), "GL_EXT_texture_storage");
   }
 
-  virtual void TearDown() {
-    gl_.Destroy();
-  }
+  void TearDown() override { gl_.Destroy(); }
 
   GLManager gl_;
   GLuint tex_;
diff --git a/gpu/command_buffer/tests/gl_unittest.cc b/gpu/command_buffer/tests/gl_unittest.cc
index f5c380f..9915190 100644
--- a/gpu/command_buffer/tests/gl_unittest.cc
+++ b/gpu/command_buffer/tests/gl_unittest.cc
@@ -14,13 +14,9 @@
 
 class GLTest : public testing::Test {
  protected:
-  virtual void SetUp() {
-    gl_.Initialize(GLManager::Options());
-  }
+  void SetUp() override { gl_.Initialize(GLManager::Options()); }
 
-  virtual void TearDown() {
-    gl_.Destroy();
-  }
+  void TearDown() override { gl_.Destroy(); }
 
   GLManager gl_;
 };
diff --git a/gpu/command_buffer/tests/gl_virtual_contexts_unittest.cc b/gpu/command_buffer/tests/gl_virtual_contexts_unittest.cc
index 17cfa9f..9373c38 100644
--- a/gpu/command_buffer/tests/gl_virtual_contexts_unittest.cc
+++ b/gpu/command_buffer/tests/gl_virtual_contexts_unittest.cc
@@ -26,7 +26,7 @@
   static const uint8 kExpectedRed[4];
   static const uint8 kExpectedGreen[4];
 
-  virtual void SetUp() {
+  void SetUp() override {
     GLManager::Options options;
     options.size = gfx::Size(kSize0, kSize0);
     gl_real_.Initialize(options);
@@ -38,7 +38,7 @@
     gl2_.Initialize(options);
   }
 
-  virtual void TearDown() {
+  void TearDown() override {
     gl1_.Destroy();
     gl2_.Destroy();
     gl_real_shared_.Destroy();
diff --git a/gpu/command_buffer/tests/occlusion_query_unittest.cc b/gpu/command_buffer/tests/occlusion_query_unittest.cc
index 7cbb1a8..2f749c7 100644
--- a/gpu/command_buffer/tests/occlusion_query_unittest.cc
+++ b/gpu/command_buffer/tests/occlusion_query_unittest.cc
@@ -14,15 +14,13 @@
 
 class OcclusionQueryTest : public testing::Test {
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     GLManager::Options options;
     options.size = gfx::Size(512, 512);
     gl_.Initialize(options);
   }
 
-  virtual void TearDown() {
-    gl_.Destroy();
-  }
+  void TearDown() override { gl_.Destroy(); }
 
   void DrawRect(float x, float z, float scale, float* color);
 
diff --git a/gpu/command_buffer_client.gypi b/gpu/command_buffer_client.gypi
index 1e9f778..316cba1 100644
--- a/gpu/command_buffer_client.gypi
+++ b/gpu/command_buffer_client.gypi
@@ -20,6 +20,8 @@
     'command_buffer/client/fenced_allocator.cc',
     'command_buffer/client/fenced_allocator.h',
     'command_buffer/client/gpu_control.h',
+    'command_buffer/client/gpu_memory_buffer_manager.cc',
+    'command_buffer/client/gpu_memory_buffer_manager.h',
     'command_buffer/client/mapped_memory.cc',
     'command_buffer/client/mapped_memory.h',
     'command_buffer/client/ring_buffer.cc',
diff --git a/gpu/config/gpu_blacklist_unittest.cc b/gpu/config/gpu_blacklist_unittest.cc
index 7547a17..c9fa415 100644
--- a/gpu/config/gpu_blacklist_unittest.cc
+++ b/gpu/config/gpu_blacklist_unittest.cc
@@ -17,7 +17,7 @@
  public:
   GpuBlacklistTest() { }
 
-  virtual ~GpuBlacklistTest() { }
+  ~GpuBlacklistTest() override {}
 
   const GPUInfo& gpu_info() const {
     return gpu_info_;
@@ -55,7 +55,7 @@
   }
 
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     gpu_info_.gpu.vendor_id = 0x10de;
     gpu_info_.gpu.device_id = 0x0640;
     gpu_info_.driver_vendor = "NVIDIA";
@@ -70,8 +70,7 @@
     gpu_info_.performance_stats.overall = 5.0;
   }
 
-  virtual void TearDown() {
-  }
+  void TearDown() override {}
 
  private:
   GPUInfo gpu_info_;
diff --git a/gpu/config/gpu_control_list_entry_unittest.cc b/gpu/config/gpu_control_list_entry_unittest.cc
index 7edb628..4a26918 100644
--- a/gpu/config/gpu_control_list_entry_unittest.cc
+++ b/gpu/config/gpu_control_list_entry_unittest.cc
@@ -20,7 +20,7 @@
 class GpuControlListEntryTest : public testing::Test {
  public:
   GpuControlListEntryTest() { }
-  virtual ~GpuControlListEntryTest() { }
+  ~GpuControlListEntryTest() override {}
 
   const GPUInfo& gpu_info() const {
     return gpu_info_;
@@ -49,7 +49,7 @@
     return GetEntryFromString(json, false);
   }
 
-  virtual void SetUp() {
+  void SetUp() override {
     gpu_info_.gpu.vendor_id = 0x10de;
     gpu_info_.gpu.device_id = 0x0640;
     gpu_info_.gpu.active = true;
@@ -1080,9 +1080,9 @@
 class GpuControlListEntryDualGPUTest : public GpuControlListEntryTest {
  public:
   GpuControlListEntryDualGPUTest() { }
-  virtual ~GpuControlListEntryDualGPUTest() { }
+  ~GpuControlListEntryDualGPUTest() override {}
 
-  virtual void SetUp() override {
+  void SetUp() override {
     // Set up a NVIDIA/Intel dual, with NVIDIA as primary and Intel as
     // secondary, and initially Intel is active.
     gpu_info_.gpu.vendor_id = 0x10de;
diff --git a/gpu/config/gpu_control_list_number_info_unittest.cc b/gpu/config/gpu_control_list_number_info_unittest.cc
index bbddcb9..f3324d2 100644
--- a/gpu/config/gpu_control_list_number_info_unittest.cc
+++ b/gpu/config/gpu_control_list_number_info_unittest.cc
@@ -10,7 +10,7 @@
 class NumberInfoTest : public testing::Test {
  public:
   NumberInfoTest() { }
-  virtual ~NumberInfoTest() { }
+  ~NumberInfoTest() override {}
 
   typedef GpuControlList::FloatInfo FloatInfo;
   typedef GpuControlList::IntInfo IntInfo;
diff --git a/gpu/config/gpu_control_list_os_info_unittest.cc b/gpu/config/gpu_control_list_os_info_unittest.cc
index 1da6f99..652b005 100644
--- a/gpu/config/gpu_control_list_os_info_unittest.cc
+++ b/gpu/config/gpu_control_list_os_info_unittest.cc
@@ -10,7 +10,7 @@
 class OsInfoTest : public testing::Test {
  public:
   OsInfoTest() { }
-  virtual ~OsInfoTest() { }
+  ~OsInfoTest() override {}
 
   typedef GpuControlList::OsInfo OsInfo;
 };
diff --git a/gpu/config/gpu_control_list_unittest.cc b/gpu/config/gpu_control_list_unittest.cc
index 856eb4a..f968183 100644
--- a/gpu/config/gpu_control_list_unittest.cc
+++ b/gpu/config/gpu_control_list_unittest.cc
@@ -32,7 +32,7 @@
  public:
   GpuControlListTest() { }
 
-  virtual ~GpuControlListTest() { }
+  ~GpuControlListTest() override {}
 
   const GPUInfo& gpu_info() const {
     return gpu_info_;
@@ -47,7 +47,7 @@
   }
 
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     gpu_info_.gpu.vendor_id = kNvidiaVendorId;
     gpu_info_.gpu.device_id = 0x0640;
     gpu_info_.driver_vendor = "NVIDIA";
@@ -62,8 +62,7 @@
     gpu_info_.performance_stats.overall = 5.0;
   }
 
-  virtual void TearDown() {
-  }
+  void TearDown() override {}
 
  private:
   GPUInfo gpu_info_;
diff --git a/gpu/config/gpu_control_list_version_info_unittest.cc b/gpu/config/gpu_control_list_version_info_unittest.cc
index 39814c8..a2d425f 100644
--- a/gpu/config/gpu_control_list_version_info_unittest.cc
+++ b/gpu/config/gpu_control_list_version_info_unittest.cc
@@ -10,7 +10,7 @@
 class VersionInfoTest : public testing::Test {
  public:
   VersionInfoTest() { }
-  virtual ~VersionInfoTest() { }
+  ~VersionInfoTest() override {}
 
   typedef GpuControlList::VersionInfo VersionInfo;
 };
diff --git a/gpu/config/gpu_driver_bug_list_unittest.cc b/gpu/config/gpu_driver_bug_list_unittest.cc
index e927e6c..33e09a1 100644
--- a/gpu/config/gpu_driver_bug_list_unittest.cc
+++ b/gpu/config/gpu_driver_bug_list_unittest.cc
@@ -19,14 +19,14 @@
  public:
   GpuDriverBugListTest() { }
 
-  virtual ~GpuDriverBugListTest() { }
+  ~GpuDriverBugListTest() override {}
 
   const GPUInfo& gpu_info() const {
     return gpu_info_;
   }
 
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     gpu_info_.gpu.vendor_id = 0x10de;
     gpu_info_.gpu.device_id = 0x0640;
     gpu_info_.driver_vendor = "NVIDIA";
@@ -41,8 +41,7 @@
     gpu_info_.performance_stats.overall = 5.0;
   }
 
-  virtual void TearDown() {
-  }
+  void TearDown() override {}
 
  private:
   GPUInfo gpu_info_;
diff --git a/gpu/config/gpu_info_collector_unittest.cc b/gpu/config/gpu_info_collector_unittest.cc
index c5e15c8..e5705ad 100644
--- a/gpu/config/gpu_info_collector_unittest.cc
+++ b/gpu/config/gpu_info_collector_unittest.cc
@@ -17,9 +17,9 @@
 class GPUInfoCollectorTest : public testing::Test {
  public:
   GPUInfoCollectorTest() {}
-  virtual ~GPUInfoCollectorTest() { }
+  ~GPUInfoCollectorTest() override {}
 
-  virtual void SetUp() {
+  void SetUp() override {
     gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>());
     ::gfx::MockGLInterface::SetGLInterface(gl_.get());
 #if defined(OS_WIN)
@@ -91,7 +91,7 @@
             gl_renderer)));
   }
 
-  virtual void TearDown() {
+  void TearDown() override {
     ::gfx::MockGLInterface::SetGLInterface(NULL);
     gl_.reset();
   }
diff --git a/gpu/config/gpu_test_config_unittest.cc b/gpu/config/gpu_test_config_unittest.cc
index b9411dc..40188f3 100644
--- a/gpu/config/gpu_test_config_unittest.cc
+++ b/gpu/config/gpu_test_config_unittest.cc
@@ -12,12 +12,12 @@
  public:
   GPUTestConfigTest() { }
 
-  virtual ~GPUTestConfigTest() { }
+  ~GPUTestConfigTest() override {}
 
  protected:
-  virtual void SetUp() { }
+  void SetUp() override {}
 
-  virtual void TearDown() { }
+  void TearDown() override {}
 };
 
 TEST_F(GPUTestConfigTest, EmptyValues) {
diff --git a/gpu/config/gpu_test_expectations_parser_unittest.cc b/gpu/config/gpu_test_expectations_parser_unittest.cc
index 810a1a8..b6ca529 100644
--- a/gpu/config/gpu_test_expectations_parser_unittest.cc
+++ b/gpu/config/gpu_test_expectations_parser_unittest.cc
@@ -12,14 +12,14 @@
  public:
   GPUTestExpectationsParserTest() { }
 
-  virtual ~GPUTestExpectationsParserTest() { }
+  ~GPUTestExpectationsParserTest() override {}
 
   const GPUTestBotConfig& bot_config() const {
     return bot_config_;
   }
 
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     bot_config_.set_os(GPUTestConfig::kOsWin7);
     bot_config_.set_build_type(GPUTestConfig::kBuildTypeRelease);
     bot_config_.AddGPUVendor(0x10de);
@@ -27,7 +27,7 @@
     ASSERT_TRUE(bot_config_.IsValid());
   }
 
-  virtual void TearDown() { }
+  void TearDown() override {}
 
  private:
   GPUTestBotConfig bot_config_;
diff --git a/gpu/skia_bindings/gl_bindings_skia_cmd_buffer.cc b/gpu/skia_bindings/gl_bindings_skia_cmd_buffer.cc
index d92f7ef..3b5460e 100644
--- a/gpu/skia_bindings/gl_bindings_skia_cmd_buffer.cc
+++ b/gpu/skia_bindings/gl_bindings_skia_cmd_buffer.cc
@@ -115,6 +115,9 @@
   functions->fUnmapBufferSubData = glUnmapBufferSubDataCHROMIUM;
   functions->fUnmapTexSubImage2D = glUnmapTexSubImage2DCHROMIUM;
   functions->fUseProgram = glUseProgram;
+  functions->fVertexAttrib1f = glVertexAttrib1f;
+  functions->fVertexAttrib2fv = glVertexAttrib2fv;
+  functions->fVertexAttrib3fv = glVertexAttrib3fv;
   functions->fVertexAttrib4fv = glVertexAttrib4fv;
   functions->fVertexAttribPointer = glVertexAttribPointer;
   functions->fViewport = glViewport;
diff --git a/gpu/tools/compositor_model_bench/forward_render_model.cc b/gpu/tools/compositor_model_bench/forward_render_model.cc
index ddacdce..03e8b1e 100644
--- a/gpu/tools/compositor_model_bench/forward_render_model.cc
+++ b/gpu/tools/compositor_model_bench/forward_render_model.cc
@@ -15,18 +15,16 @@
  public:
   ForwardRenderNodeVisitor() {}
 
-  virtual void BeginVisitRenderNode(RenderNode* v) override {
-    NOTREACHED();
-  }
+  void BeginVisitRenderNode(RenderNode* v) override { NOTREACHED(); }
 
-  virtual void BeginVisitCCNode(CCNode* v) override {
+  void BeginVisitCCNode(CCNode* v) override {
     if (!v->drawsContent())
       return;
     ConfigAndActivateShaderForNode(v);
     DrawQuad(v->width(), v->height());
   }
 
-  virtual void BeginVisitContentLayerNode(ContentLayerNode* l) override {
+  void BeginVisitContentLayerNode(ContentLayerNode* l) override {
     if (!l->drawsContent())
       return;
     ConfigAndActivateShaderForTiling(l);
diff --git a/gpu/tools/compositor_model_bench/forward_render_model.h b/gpu/tools/compositor_model_bench/forward_render_model.h
index 68f02a8..5495c18 100644
--- a/gpu/tools/compositor_model_bench/forward_render_model.h
+++ b/gpu/tools/compositor_model_bench/forward_render_model.h
@@ -19,9 +19,9 @@
   explicit ForwardRenderSimulator(RenderNode* root,
                                   int window_width,
                                   int window_height);
-  virtual ~ForwardRenderSimulator() override;
-  virtual void Update() override;
-  virtual void Resize(int width, int height) override;
+  ~ForwardRenderSimulator() override;
+  void Update() override;
+  void Resize(int width, int height) override;
 
  private:
   scoped_ptr<ForwardRenderNodeVisitor> visitor_;
diff --git a/gpu/tools/compositor_model_bench/render_model_utils.h b/gpu/tools/compositor_model_bench/render_model_utils.h
index 30aac0f..8d6ed3c 100644
--- a/gpu/tools/compositor_model_bench/render_model_utils.h
+++ b/gpu/tools/compositor_model_bench/render_model_utils.h
@@ -25,13 +25,13 @@
   typedef std::vector<Tile>::iterator tile_iter;
 
   explicit TextureGenerator(RenderNode* root);
-  virtual ~TextureGenerator() override;
+  ~TextureGenerator() override;
 
   // RenderNodeVisitor functions look for textures and pass them
   // off to HandleTexture (which behaves appropriately depending
   // on which pass we are in.)
-  virtual void BeginVisitRenderNode(RenderNode* node) override;
-  virtual void BeginVisitCCNode(CCNode* node) override;
+  void BeginVisitRenderNode(RenderNode* node) override;
+  void BeginVisitCCNode(CCNode* node) override;
 
  private:
   enum TextureGenStage {
diff --git a/gpu/tools/compositor_model_bench/render_tree.h b/gpu/tools/compositor_model_bench/render_tree.h
index e28cb80..6b43fbe 100644
--- a/gpu/tools/compositor_model_bench/render_tree.h
+++ b/gpu/tools/compositor_model_bench/render_tree.h
@@ -136,8 +136,8 @@
 class ContentLayerNode : public RenderNode {
  public:
   ContentLayerNode();
-  virtual ~ContentLayerNode();
-  virtual void Accept(RenderNodeVisitor* v) override;
+  ~ContentLayerNode() override;
+  void Accept(RenderNodeVisitor* v) override;
 
   void set_skipsDraw(bool skips) {
     skipsDraw_ = skips;
@@ -155,9 +155,9 @@
 class CCNode : public RenderNode {
  public:
   CCNode();
-  virtual ~CCNode();
+  ~CCNode() override;
 
-  virtual void Accept(RenderNodeVisitor* v) override;
+  void Accept(RenderNodeVisitor* v) override;
 
   ShaderID vertex_shader() {
     return vertex_shader_;
diff --git a/mojo/aura/surface_context_factory.cc b/mojo/aura/surface_context_factory.cc
index aa96401..eb7391d 100644
--- a/mojo/aura/surface_context_factory.cc
+++ b/mojo/aura/surface_context_factory.cc
@@ -52,7 +52,8 @@
   return nullptr;
 }
 
-cc::GpuMemoryBufferManager* SurfaceContextFactory::GetGpuMemoryBufferManager() {
+gpu::GpuMemoryBufferManager*
+SurfaceContextFactory::GetGpuMemoryBufferManager() {
   return nullptr;
 }
 
diff --git a/mojo/aura/surface_context_factory.h b/mojo/aura/surface_context_factory.h
index d60080e..e9cdbed 100644
--- a/mojo/aura/surface_context_factory.h
+++ b/mojo/aura/surface_context_factory.h
@@ -30,7 +30,7 @@
   void RemoveCompositor(ui::Compositor* compositor) override;
   bool DoesCreateTestContexts() override;
   cc::SharedBitmapManager* GetSharedBitmapManager() override;
-  cc::GpuMemoryBufferManager* GetGpuMemoryBufferManager() override;
+  gpu::GpuMemoryBufferManager* GetGpuMemoryBufferManager() override;
   base::MessageLoopProxy* GetCompositorMessageLoop() override;
   scoped_ptr<cc::SurfaceIdAllocator> CreateSurfaceIdAllocator() override;
 
diff --git a/mojo/tools/roll/cc_strip_video.patch b/mojo/tools/roll/cc_strip_video.patch
index 6bae830..2bd6fb8 100644
--- a/mojo/tools/roll/cc_strip_video.patch
+++ b/mojo/tools/roll/cc_strip_video.patch
@@ -1,5 +1,5 @@
 diff --git a/cc/BUILD.gn b/cc/BUILD.gn
-index 74a3c4b..c1df4c9 100644
+index 24c5833..8cb8e8a 100644
 --- a/cc/BUILD.gn
 +++ b/cc/BUILD.gn
 @@ -208,13 +208,6 @@ component("cc") {
@@ -25,15 +25,15 @@
      "resources/zero_copy_raster_worker_pool.cc",
      "resources/zero_copy_raster_worker_pool.h",
      "scheduler/begin_frame_source.cc",
-@@ -488,7 +479,6 @@ component("cc") {
-     "//base/third_party/dynamic_annotations",
+@@ -489,7 +480,6 @@ component("cc") {
      "//gpu",
      "//gpu/command_buffer/client:gles2_interface",
+     "//gpu/command_buffer/client:gpu_memory_buffer_manager",
 -    "//media",
      "//ui/events:events_base",
      "//ui/gfx",
      "//ui/gfx/geometry",
-@@ -557,8 +547,6 @@ source_set("test_support") {
+@@ -558,8 +548,6 @@ source_set("test_support") {
      "test/fake_tile_manager_client.h",
      "test/fake_ui_resource_layer_tree_host_impl.cc",
      "test/fake_ui_resource_layer_tree_host_impl.h",
@@ -42,7 +42,7 @@
      "test/geometry_test_utils.cc",
      "test/geometry_test_utils.h",
      "test/test_in_process_context_provider.cc",
-@@ -705,7 +693,6 @@ test("cc_unittests") {
+@@ -707,7 +695,6 @@ test("cc_unittests") {
      "layers/tiled_layer_unittest.cc",
      "layers/ui_resource_layer_impl_unittest.cc",
      "layers/ui_resource_layer_unittest.cc",
@@ -50,7 +50,7 @@
      "output/begin_frame_args_unittest.cc",
      "output/delegating_renderer_unittest.cc",
      "output/filter_operations_unittest.cc",
-@@ -735,7 +722,6 @@ test("cc_unittests") {
+@@ -737,7 +724,6 @@ test("cc_unittests") {
      "resources/texture_uploader_unittest.cc",
      "resources/tile_manager_unittest.cc",
      "resources/tile_priority_unittest.cc",
@@ -58,7 +58,7 @@
      "scheduler/begin_frame_source_unittest.cc",
      "scheduler/delay_based_time_source_unittest.cc",
      "scheduler/scheduler_state_machine_unittest.cc",
-@@ -763,7 +749,6 @@ test("cc_unittests") {
+@@ -765,7 +751,6 @@ test("cc_unittests") {
      "trees/layer_tree_host_unittest_picture.cc",
      "trees/layer_tree_host_unittest_proxy.cc",
      "trees/layer_tree_host_unittest_scroll.cc",
@@ -66,7 +66,7 @@
      "trees/layer_tree_impl_unittest.cc",
      "trees/occlusion_tracker_unittest.cc",
      "trees/occlusion_unittest.cc",
-@@ -790,7 +775,6 @@ test("cc_unittests") {
+@@ -792,7 +777,6 @@ test("cc_unittests") {
      "//gpu:test_support",
      "//gpu/command_buffer/client:gles2_interface",
      "//gpu/command_buffer/common:gles2_utils",
@@ -74,7 +74,7 @@
      "//testing/gmock",
      "//testing/gtest",
      "//ui/events:events_base",
-@@ -822,7 +806,6 @@ test("cc_perftests") {
+@@ -824,7 +808,6 @@ test("cc_perftests") {
      "//gpu",
      "//gpu:test_support",
      "//gpu/command_buffer/common:gles2_utils",
@@ -253,7 +253,7 @@
 -
 -}  // namespace cc
 diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc
-index 61d233a..6b15faf 100644
+index a302f7e..b93ddcf 100644
 --- a/cc/output/gl_renderer.cc
 +++ b/cc/output/gl_renderer.cc
 @@ -13,7 +13,6 @@
@@ -265,7 +265,7 @@
  #include "cc/output/compositor_frame_metadata.h"
  #include "cc/output/context_provider.h"
 diff --git a/cc/output/renderer_pixeltest.cc b/cc/output/renderer_pixeltest.cc
-index 3fe1caf..b2be4e6 100644
+index c172869..a0ce823 100644
 --- a/cc/output/renderer_pixeltest.cc
 +++ b/cc/output/renderer_pixeltest.cc
 @@ -12,7 +12,6 @@
@@ -636,10 +636,10 @@
  
  namespace cc {
 diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc
-index ec1100f..7b466d0 100644
+index fb23ba6..8e7fa0f 100644
 --- a/cc/trees/layer_tree_host_impl_unittest.cc
 +++ b/cc/trees/layer_tree_host_impl_unittest.cc
-@@ -26,7 +26,6 @@
+@@ -27,7 +27,6 @@
  #include "cc/layers/solid_color_scrollbar_layer_impl.h"
  #include "cc/layers/texture_layer_impl.h"
  #include "cc/layers/tiled_layer_impl.h"
@@ -647,7 +647,7 @@
  #include "cc/output/begin_frame_args.h"
  #include "cc/output/compositor_frame_ack.h"
  #include "cc/output/compositor_frame_metadata.h"
-@@ -47,7 +46,6 @@
+@@ -48,7 +47,6 @@
  #include "cc/test/fake_picture_pile_impl.h"
  #include "cc/test/fake_proxy.h"
  #include "cc/test/fake_rendering_stats_instrumentation.h"
@@ -655,7 +655,7 @@
  #include "cc/test/geometry_test_utils.h"
  #include "cc/test/layer_test_common.h"
  #include "cc/test/render_pass_test_common.h"
-@@ -56,7 +54,6 @@
+@@ -57,7 +55,6 @@
  #include "cc/test/test_web_graphics_context_3d.h"
  #include "cc/trees/layer_tree_impl.h"
  #include "cc/trees/single_thread_proxy.h"
@@ -663,7 +663,7 @@
  #include "testing/gmock/include/gmock/gmock.h"
  #include "testing/gtest/include/gtest/gtest.h"
  #include "third_party/skia/include/core/SkMallocPixelRef.h"
-@@ -70,7 +67,6 @@ using ::testing::Return;
+@@ -71,7 +68,6 @@ using ::testing::Return;
  using ::testing::AnyNumber;
  using ::testing::AtLeast;
  using ::testing::_;
@@ -671,7 +671,7 @@
  
  namespace cc {
  namespace {
-@@ -95,7 +91,6 @@ class LayerTreeHostImplTest : public testing::Test,
+@@ -96,7 +92,6 @@ class LayerTreeHostImplTest : public testing::Test,
          reduce_memory_result_(true),
          current_limit_bytes_(0),
          current_priority_cutoff_value_(0) {
@@ -679,7 +679,7 @@
    }
  
    LayerTreeSettings DefaultSettings() {
-@@ -5063,18 +5058,6 @@ TEST_F(LayerTreeHostImplTest, LayersFreeTextures) {
+@@ -5090,18 +5085,6 @@ TEST_F(LayerTreeHostImplTest, LayersFreeTextures) {
        LayerImpl::Create(host_impl_->active_tree(), 1);
    root_layer->SetBounds(gfx::Size(10, 10));
  
@@ -698,7 +698,7 @@
    scoped_ptr<IOSurfaceLayerImpl> io_surface_layer =
        IOSurfaceLayerImpl::Create(host_impl_->active_tree(), 5);
    io_surface_layer->SetBounds(gfx::Size(10, 10));
-@@ -6138,16 +6121,6 @@ TEST_F(LayerTreeHostImplTest,
+@@ -6165,16 +6148,6 @@ TEST_F(LayerTreeHostImplTest,
    scoped_ptr<SolidColorLayerImpl> root_layer =
        SolidColorLayerImpl::Create(host_impl_->active_tree(), 1);
  
@@ -716,7 +716,7 @@
    EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
    host_impl_->DrawLayers(&frame, gfx::FrameTime::Now());
 diff --git a/cc/trees/layer_tree_host_unittest.cc b/cc/trees/layer_tree_host_unittest.cc
-index 8fb9b8c..cb3cdef 100644
+index 8d554dc..d15c6a3 100644
 --- a/cc/trees/layer_tree_host_unittest.cc
 +++ b/cc/trees/layer_tree_host_unittest.cc
 @@ -18,7 +18,6 @@
@@ -765,7 +765,7 @@
  // to the compositor thread, even though no resources are updated in
  // response to that invalidation.
 diff --git a/cc/trees/layer_tree_host_unittest_context.cc b/cc/trees/layer_tree_host_unittest_context.cc
-index 8349bae..b9e15c6 100644
+index b12a8da..fb05300 100644
 --- a/cc/trees/layer_tree_host_unittest_context.cc
 +++ b/cc/trees/layer_tree_host_unittest_context.cc
 @@ -15,8 +15,6 @@
@@ -803,7 +803,7 @@
    }
  
    void LoseContext() {
-@@ -1013,49 +1006,6 @@ class LayerTreeHostContextTestDontUseLostResources
+@@ -1083,49 +1076,6 @@ class LayerTreeHostContextTestDontUseLostResources
      layer_with_mask->SetMaskLayer(mask.get());
      root->AddChild(layer_with_mask);
  
@@ -853,7 +853,7 @@
      if (!delegating_renderer()) {
        // TODO(danakj): IOSurface layer can not be transported. crbug.com/239335
        scoped_refptr<IOSurfaceLayer> io_surface = IOSurfaceLayer::Create();
-@@ -1085,14 +1035,6 @@ class LayerTreeHostContextTestDontUseLostResources
+@@ -1155,14 +1105,6 @@ class LayerTreeHostContextTestDontUseLostResources
  
    void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) override {
      LayerTreeHostContextTest::CommitCompleteOnThread(host_impl);
@@ -868,7 +868,7 @@
    }
  
    DrawResult PrepareToDrawOnThread(LayerTreeHostImpl* host_impl,
-@@ -1142,14 +1084,6 @@ class LayerTreeHostContextTestDontUseLostResources
+@@ -1212,14 +1154,6 @@ class LayerTreeHostContextTestDontUseLostResources
    scoped_refptr<DelegatedFrameResourceCollection>
        delegated_resource_collection_;
    scoped_refptr<DelegatedFrameProvider> delegated_frame_provider_;
diff --git a/mojo/tools/roll/ui_gl_init.patch b/mojo/tools/roll/ui_gl_init.patch
new file mode 100644
index 0000000..2b16af8
--- /dev/null
+++ b/mojo/tools/roll/ui_gl_init.patch
@@ -0,0 +1,36 @@
+diff --git a/ui/gl/gl_surface.cc b/ui/gl/gl_surface.cc
+index 620cee7..4459d48 100644
+--- a/ui/gl/gl_surface.cc
++++ b/ui/gl/gl_surface.cc
+@@ -28,7 +28,7 @@ base::LazyInstance<base::ThreadLocalPointer<GLSurface> >::Leaky
+ }  // namespace
+ 
+ // static
+-bool GLSurface::InitializeOneOff() {
++bool GLSurface::InitializeOneOff(GLImplementation impl) {
+   DCHECK_EQ(kGLImplementationNone, GetGLImplementation());
+ 
+   TRACE_EVENT0("gpu", "GLSurface::InitializeOneOff");
+@@ -40,7 +40,8 @@ bool GLSurface::InitializeOneOff() {
+   CommandLine* cmd = CommandLine::ForCurrentProcess();
+ 
+   // The default implementation is always the first one in list.
+-  GLImplementation impl = allowed_impls[0];
++  if (impl == kGLImplementationNone)
++    impl = allowed_impls[0];
+   bool fallback_to_osmesa = false;
+   if (cmd->HasSwitch(switches::kOverrideUseGLWithOSMesaForTests)) {
+     impl = kGLImplementationOSMesaGL;
+diff --git a/ui/gl/gl_surface.h b/ui/gl/gl_surface.h
+index 54bcc37..d458063 100644
+--- a/ui/gl/gl_surface.h
++++ b/ui/gl/gl_surface.h
+@@ -72,7 +72,7 @@ class GL_EXPORT GLSurface : public base::RefCounted<GLSurface> {
+   virtual bool PostSubBuffer(int x, int y, int width, int height);
+ 
+   // Initialize GL bindings.
+-  static bool InitializeOneOff();
++  static bool InitializeOneOff(GLImplementation = kGLImplementationNone);
+ 
+   // Unit tests should call these instead of InitializeOneOff() to set up
+   // GL bindings appropriate for tests.
diff --git a/net/android/java/src/org/chromium/net/NetworkChangeNotifier.java b/net/android/java/src/org/chromium/net/NetworkChangeNotifier.java
index 476ff34..1008b7e 100644
--- a/net/android/java/src/org/chromium/net/NetworkChangeNotifier.java
+++ b/net/android/java/src/org/chromium/net/NetworkChangeNotifier.java
@@ -114,7 +114,7 @@
      *    network connectivity.
      */
     public static void setAutoDetectConnectivityState(boolean shouldAutoDetect) {
-        getInstance().setAutoDetectConnectivityStateInternal(shouldAutoDetect);
+        getInstance().setAutoDetectConnectivityStateInternal(shouldAutoDetect, false);
     }
 
     private void destroyAutoDetector() {
@@ -124,7 +124,20 @@
         }
     }
 
-    private void setAutoDetectConnectivityStateInternal(boolean shouldAutoDetect) {
+    /**
+     * Registers to always receive network change notifications no matter if
+     * the app is in the background or foreground.
+     * Note that in normal circumstances, chrome embedders should use
+     * {@code setAutoDetectConnectivityState} to listen to network changes only
+     * when the app is in the foreground, because network change observers
+     * might perform expensive work depending on the network connectivity.
+     */
+    public static void registerToReceiveNotificationsAlways() {
+        getInstance().setAutoDetectConnectivityStateInternal(true, true);
+    }
+
+    private void setAutoDetectConnectivityStateInternal(
+            boolean shouldAutoDetect, boolean alwaysWatchForChanges) {
         if (shouldAutoDetect) {
             if (mAutoDetector == null) {
                 mAutoDetector = new NetworkChangeNotifierAutoDetect(
@@ -134,7 +147,8 @@
                             updateCurrentConnectionType(newConnectionType);
                         }
                     },
-                    mContext);
+                    mContext,
+                    alwaysWatchForChanges);
                 updateCurrentConnectionType(mAutoDetector.getCurrentConnectionType());
             }
         } else {
diff --git a/net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java b/net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java
index 5a46a6c..1e72da9 100644
--- a/net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java
+++ b/net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java
@@ -101,14 +101,24 @@
         public void onConnectionTypeChanged(int newConnectionType);
     }
 
-    public NetworkChangeNotifierAutoDetect(Observer observer, Context context) {
+    /**
+     * Constructs a NetworkChangeNotifierAutoDetect.
+     * @param alwaysWatchForChanges If true, always watch for network changes.
+     *    Otherwise, only watch if app is in foreground.
+     */
+    public NetworkChangeNotifierAutoDetect(Observer observer, Context context,
+            boolean alwaysWatchForChanges) {
         mObserver = observer;
         mContext = context.getApplicationContext();
         mConnectivityManagerDelegate = new ConnectivityManagerDelegate(context);
         mWifiManagerDelegate = new WifiManagerDelegate(context);
         mConnectionType = getCurrentConnectionType();
         mWifiSSID = getCurrentWifiSSID();
-        ApplicationStatus.registerApplicationStateListener(this);
+        if (alwaysWatchForChanges) {
+            registerReceiver();
+        } else {
+            ApplicationStatus.registerApplicationStateListener(this);
+        }
     }
 
     /**
diff --git a/net/base/address_tracker_linux.h b/net/base/address_tracker_linux.h
index 2574fc7..a960287 100644
--- a/net/base/address_tracker_linux.h
+++ b/net/base/address_tracker_linux.h
@@ -47,7 +47,7 @@
   AddressTrackerLinux(const base::Closure& address_callback,
                       const base::Closure& link_callback,
                       const base::Closure& tunnel_callback);
-  virtual ~AddressTrackerLinux();
+  ~AddressTrackerLinux() override;
 
   // In tracking mode, it starts watching the system configuration for
   // changes. The current thread must have a MessageLoopForIO. In
@@ -108,8 +108,8 @@
   void AbortAndForceOnline();
 
   // MessageLoopForIO::Watcher:
-  virtual void OnFileCanReadWithoutBlocking(int fd) override;
-  virtual void OnFileCanWriteWithoutBlocking(int /* fd */) override;
+  void OnFileCanReadWithoutBlocking(int fd) override;
+  void OnFileCanWriteWithoutBlocking(int /* fd */) override;
 
   // Close |netlink_fd_|
   void CloseSocket();
diff --git a/net/base/directory_lister_unittest.cc b/net/base/directory_lister_unittest.cc
index 98ecbbd..869e4f6 100644
--- a/net/base/directory_lister_unittest.cc
+++ b/net/base/directory_lister_unittest.cc
@@ -91,8 +91,7 @@
 
 class DirectoryListerTest : public PlatformTest {
  public:
-
-  virtual void SetUp() override {
+  void SetUp() override {
     const int kMaxDepth = 3;
     const int kBranchingFactor = 4;
     const int kFilesPerDirectory = 5;
diff --git a/net/base/dns_reloader.cc b/net/base/dns_reloader.cc
index 3a92418..e0e0b76 100644
--- a/net/base/dns_reloader.cc
+++ b/net/base/dns_reloader.cc
@@ -46,7 +46,7 @@
   };
 
   // NetworkChangeNotifier::DNSObserver:
-  virtual void OnDNSChanged() override {
+  void OnDNSChanged() override {
     DCHECK(base::MessageLoopForIO::IsCurrent());
     base::AutoLock l(lock_);
     resolver_generation_++;
@@ -84,7 +84,7 @@
     net::NetworkChangeNotifier::AddDNSObserver(this);
   }
 
-  virtual ~DnsReloader() {
+  ~DnsReloader() override {
     NOTREACHED();  // LeakyLazyInstance is not destructed.
   }
 
diff --git a/net/base/elements_upload_data_stream_unittest.cc b/net/base/elements_upload_data_stream_unittest.cc
index 91c390c..1882e9a 100644
--- a/net/base/elements_upload_data_stream_unittest.cc
+++ b/net/base/elements_upload_data_stream_unittest.cc
@@ -125,11 +125,11 @@
 
 class ElementsUploadDataStreamTest : public PlatformTest {
  public:
-  virtual void SetUp() {
+  void SetUp() override {
     PlatformTest::SetUp();
     ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
   }
-  virtual ~ElementsUploadDataStreamTest() {
+  ~ElementsUploadDataStreamTest() override {
     element_readers_.clear();
     base::RunLoop().RunUntilIdle();
   }
diff --git a/net/base/file_stream_unittest.cc b/net/base/file_stream_unittest.cc
index 883421b..fc9257e 100644
--- a/net/base/file_stream_unittest.cc
+++ b/net/base/file_stream_unittest.cc
@@ -46,13 +46,13 @@
 
 class FileStreamTest : public PlatformTest {
  public:
-  virtual void SetUp() {
+  void SetUp() override {
     PlatformTest::SetUp();
 
     base::CreateTemporaryFile(&temp_file_path_);
     base::WriteFile(temp_file_path_, kTestData, kTestDataSize);
   }
-  virtual void TearDown() {
+  void TearDown() override {
     // FileStreamContexts must be asynchronously closed on the file task runner
     // before they can be deleted. Pump the RunLoop to avoid leaks.
     base::RunLoop().RunUntilIdle();
diff --git a/net/base/ip_endpoint_unittest.cc b/net/base/ip_endpoint_unittest.cc
index 5698cc4..5d70911 100644
--- a/net/base/ip_endpoint_unittest.cc
+++ b/net/base/ip_endpoint_unittest.cc
@@ -33,7 +33,7 @@
 
 class IPEndPointTest : public PlatformTest {
  public:
-  virtual void SetUp() {
+  void SetUp() override {
     // This is where we populate the TestData.
     for (int index = 0; index < test_count; ++index) {
       EXPECT_TRUE(ParseIPLiteralToNumber(tests[index].host,
diff --git a/net/base/keygen_handler_unittest.cc b/net/base/keygen_handler_unittest.cc
index af4e01d..2357328 100644
--- a/net/base/keygen_handler_unittest.cc
+++ b/net/base/keygen_handler_unittest.cc
@@ -32,13 +32,13 @@
    explicit StubCryptoModuleDelegate(crypto::ScopedPK11Slot slot)
        : slot_(slot.Pass()) {}
 
-   virtual std::string RequestPassword(const std::string& slot_name,
-                                       bool retry,
-                                       bool* cancelled) override{
+   std::string RequestPassword(const std::string& slot_name,
+                               bool retry,
+                               bool* cancelled) override {
      return std::string();
    }
 
-   virtual crypto::ScopedPK11Slot RequestSlot() override {
+   crypto::ScopedPK11Slot RequestSlot() override {
      return crypto::ScopedPK11Slot(PK11_ReferenceSlot(slot_.get()));
    }
 
@@ -50,7 +50,7 @@
 class KeygenHandlerTest : public ::testing::Test {
  public:
   KeygenHandlerTest() {}
-  virtual ~KeygenHandlerTest() {}
+  ~KeygenHandlerTest() override {}
 
   scoped_ptr<KeygenHandler> CreateKeygenHandler() {
     scoped_ptr<KeygenHandler> handler(new KeygenHandler(
diff --git a/net/base/net_log_logger_unittest.cc b/net/base/net_log_logger_unittest.cc
index 2f63b8d..a8df205 100644
--- a/net/base/net_log_logger_unittest.cc
+++ b/net/base/net_log_logger_unittest.cc
@@ -18,7 +18,7 @@
 
 class NetLogLoggerTest : public testing::Test {
  public:
-  virtual void SetUp() {
+  void SetUp() override {
     ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
     log_path_ = temp_dir_.path().AppendASCII("NetLogFile");
   }
diff --git a/net/base/network_change_notifier_linux.cc b/net/base/network_change_notifier_linux.cc
index b10f8a8..f77025a 100644
--- a/net/base/network_change_notifier_linux.cc
+++ b/net/base/network_change_notifier_linux.cc
@@ -15,7 +15,7 @@
 class NetworkChangeNotifierLinux::Thread : public base::Thread {
  public:
   Thread();
-  virtual ~Thread();
+  ~Thread() override;
 
   // Plumbing for NetworkChangeNotifier::GetCurrentConnectionType.
   // Safe to call from any thread.
@@ -29,8 +29,8 @@
 
  protected:
   // base::Thread
-  virtual void Init() override;
-  virtual void CleanUp() override;
+  void Init() override;
+  void CleanUp() override;
 
  private:
   scoped_ptr<DnsConfigService> dns_config_service_;
diff --git a/net/base/network_change_notifier_linux.h b/net/base/network_change_notifier_linux.h
index 1e8a7eb..5a0f6df 100644
--- a/net/base/network_change_notifier_linux.h
+++ b/net/base/network_change_notifier_linux.h
@@ -22,14 +22,14 @@
   class Thread;
 
   NetworkChangeNotifierLinux();
-  virtual ~NetworkChangeNotifierLinux();
+  ~NetworkChangeNotifierLinux() override;
   static NetworkChangeCalculatorParams NetworkChangeCalculatorParamsLinux();
 
   // NetworkChangeNotifier:
-  virtual ConnectionType GetCurrentConnectionType() const override;
+  ConnectionType GetCurrentConnectionType() const override;
 
-  virtual const internal::AddressTrackerLinux*
-      GetAddressTrackerInternal() const override;
+  const internal::AddressTrackerLinux* GetAddressTrackerInternal()
+      const override;
 
   // The thread used to listen for notifications.  This relays the notification
   // to the registered observers without posting back to the thread the object
diff --git a/net/base/priority_queue_unittest.cc b/net/base/priority_queue_unittest.cc
index 87a8299..3e68acf 100644
--- a/net/base/priority_queue_unittest.cc
+++ b/net/base/priority_queue_unittest.cc
@@ -25,7 +25,7 @@
  protected:
   PriorityQueueTest() : queue_(kNumPriorities) {}
 
-  virtual void SetUp() override {
+  void SetUp() override {
     CheckEmpty();
     for (size_t i = 0; i < kNumElements; ++i) {
       EXPECT_EQ(i, queue_.size());
diff --git a/net/base/registry_controlled_domains/registry_controlled_domain_unittest.cc b/net/base/registry_controlled_domains/registry_controlled_domain_unittest.cc
index 7a4a528..22bd963 100644
--- a/net/base/registry_controlled_domains/registry_controlled_domain_unittest.cc
+++ b/net/base/registry_controlled_domains/registry_controlled_domain_unittest.cc
@@ -82,7 +82,7 @@
     SetFindDomainGraph(graph, sizeof(Graph));
   }
 
-  virtual void TearDown() { SetFindDomainGraph(); }
+  void TearDown() override { SetFindDomainGraph(); }
 };
 
 TEST_F(RegistryControlledDomainTest, TestGetDomainAndRegistry) {
diff --git a/net/base/sdch_dictionary_fetcher_unittest.cc b/net/base/sdch_dictionary_fetcher_unittest.cc
index af66681..a8b814e 100644
--- a/net/base/sdch_dictionary_fetcher_unittest.cc
+++ b/net/base/sdch_dictionary_fetcher_unittest.cc
@@ -105,7 +105,7 @@
  public:
   SdchDictionaryFetcherTest() {}
 
-  virtual void SetUp() override {
+  void SetUp() override {
     DCHECK(!fetcher_.get());
 
     URLRequestSpecifiedResponseJob::AddUrlHandler();
@@ -115,7 +115,7 @@
         fetcher_delegate_.get(), context_.get()));
   }
 
-  virtual void TearDown() override {
+  void TearDown() override {
     URLRequestSpecifiedResponseJob::RemoveUrlHandler();
     fetcher_.reset();
     context_.reset();
diff --git a/net/base/sdch_manager_unittest.cc b/net/base/sdch_manager_unittest.cc
index f1b39e7..c1a25da 100644
--- a/net/base/sdch_manager_unittest.cc
+++ b/net/base/sdch_manager_unittest.cc
@@ -34,7 +34,7 @@
   SdchManager* sdch_manager() { return sdch_manager_.get(); }
 
   // Reset globals back to default state.
-  virtual void TearDown() {
+  void TearDown() override {
     SdchManager::EnableSdchSupport(default_support_);
     SdchManager::EnableSecureSchemeSupport(default_https_support_);
   }
diff --git a/net/base/trace_net_log_observer_unittest.cc b/net/base/trace_net_log_observer_unittest.cc
index 2e20707..5256bac 100644
--- a/net/base/trace_net_log_observer_unittest.cc
+++ b/net/base/trace_net_log_observer_unittest.cc
@@ -60,7 +60,7 @@
     trace_events_.reset(new base::ListValue());
   }
 
-  virtual ~TraceNetLogObserverTest() {
+  ~TraceNetLogObserverTest() override {
     DCHECK(!TraceLog::GetInstance()->IsEnabled());
   }
 
diff --git a/net/base/upload_bytes_element_reader_unittest.cc b/net/base/upload_bytes_element_reader_unittest.cc
index e15bbcf..1d2f52f 100644
--- a/net/base/upload_bytes_element_reader_unittest.cc
+++ b/net/base/upload_bytes_element_reader_unittest.cc
@@ -15,7 +15,7 @@
 
 class UploadBytesElementReaderTest : public PlatformTest {
  protected:
-  virtual void SetUp() override {
+  void SetUp() override {
     const char kData[] = "123abc";
     bytes_.assign(kData, kData + arraysize(kData));
     reader_.reset(new UploadBytesElementReader(&bytes_[0], bytes_.size()));
diff --git a/net/base/upload_file_element_reader_unittest.cc b/net/base/upload_file_element_reader_unittest.cc
index 2069fa0..b0374ac 100644
--- a/net/base/upload_file_element_reader_unittest.cc
+++ b/net/base/upload_file_element_reader_unittest.cc
@@ -18,7 +18,7 @@
 
 class UploadFileElementReaderTest : public PlatformTest {
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     PlatformTest::SetUp();
     // Some tests (*.ReadPartially) rely on bytes_.size() being even.
     const char kData[] = "123456789abcdefghi";
@@ -46,7 +46,7 @@
     EXPECT_FALSE(reader_->IsInMemory());
   }
 
-  virtual ~UploadFileElementReaderTest() {
+  ~UploadFileElementReaderTest() override {
     reader_.reset();
     base::RunLoop().RunUntilIdle();
   }
diff --git a/net/cert/cert_verify_proc_nss.h b/net/cert/cert_verify_proc_nss.h
index e3eb11f..395facf 100644
--- a/net/cert/cert_verify_proc_nss.h
+++ b/net/cert/cert_verify_proc_nss.h
@@ -17,10 +17,10 @@
  public:
   CertVerifyProcNSS();
 
-  virtual bool SupportsAdditionalTrustAnchors() const override;
+  bool SupportsAdditionalTrustAnchors() const override;
 
  protected:
-  virtual ~CertVerifyProcNSS();
+  ~CertVerifyProcNSS() override;
 
   // Like VerifyInternal, but adds a |chain_verify_callback| to override trust
   // decisions. See the documentation for CERTChainVerifyCallback and
@@ -34,12 +34,12 @@
                          CertVerifyResult* verify_result);
 
  private:
-  virtual int VerifyInternal(X509Certificate* cert,
-                             const std::string& hostname,
-                             int flags,
-                             CRLSet* crl_set,
-                             const CertificateList& additional_trust_anchors,
-                             CertVerifyResult* verify_result) override;
+  int VerifyInternal(X509Certificate* cert,
+                     const std::string& hostname,
+                     int flags,
+                     CRLSet* crl_set,
+                     const CertificateList& additional_trust_anchors,
+                     CertVerifyResult* verify_result) override;
 };
 
 }  // namespace net
diff --git a/net/cert/cert_verify_proc_unittest.cc b/net/cert/cert_verify_proc_unittest.cc
index 4031eac..10a880b 100644
--- a/net/cert/cert_verify_proc_unittest.cc
+++ b/net/cert/cert_verify_proc_unittest.cc
@@ -114,7 +114,7 @@
   CertVerifyProcTest()
       : verify_proc_(CertVerifyProc::CreateDefault()) {
   }
-  virtual ~CertVerifyProcTest() {}
+  ~CertVerifyProcTest() override {}
 
  protected:
   bool SupportsAdditionalTrustAnchors() {
diff --git a/net/cert/ct_ev_whitelist.h b/net/cert/ct_ev_whitelist.h
new file mode 100644
index 0000000..a12b9d5
--- /dev/null
+++ b/net/cert/ct_ev_whitelist.h
@@ -0,0 +1,40 @@
+// 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 NET_CERT_CT_EV_WHITELIST_H_
+#define NET_CERT_CT_EV_WHITELIST_H_
+
+#include <string>
+
+#include "base/memory/ref_counted.h"
+#include "net/base/net_export.h"
+
+namespace net {
+
+namespace ct {
+
+class NET_EXPORT EVCertsWhitelist
+    : public base::RefCountedThreadSafe<EVCertsWhitelist> {
+ public:
+  // Returns true if the |certificate_hash| appears in the EV certificate hashes
+  // whitelist.
+  virtual bool ContainsCertificateHash(
+      const std::string& certificate_hash) const = 0;
+
+  // Returns true if the global EV certificate hashes whitelist is non-empty,
+  // false otherwise.
+  virtual bool IsValid() const = 0;
+
+ protected:
+  virtual ~EVCertsWhitelist() {}
+
+ private:
+  friend class base::RefCountedThreadSafe<EVCertsWhitelist>;
+};
+
+}  // namespace ct
+
+}  // namespace net
+
+#endif  // NET_CERT_CT_EV_WHITELIST_H_
diff --git a/net/cert/ct_log_verifier_unittest.cc b/net/cert/ct_log_verifier_unittest.cc
index e2918c9..373f69e 100644
--- a/net/cert/ct_log_verifier_unittest.cc
+++ b/net/cert/ct_log_verifier_unittest.cc
@@ -18,7 +18,7 @@
  public:
   CTLogVerifierTest() {}
 
-  virtual void SetUp() override {
+  void SetUp() override {
     log_ = CTLogVerifier::Create(ct::GetTestPublicKey(), "testlog").Pass();
 
     ASSERT_TRUE(log_);
diff --git a/net/cert/ct_objects_extractor_unittest.cc b/net/cert/ct_objects_extractor_unittest.cc
index ac46755..90f01f7 100644
--- a/net/cert/ct_objects_extractor_unittest.cc
+++ b/net/cert/ct_objects_extractor_unittest.cc
@@ -20,7 +20,7 @@
 
 class CTObjectsExtractorTest : public ::testing::Test {
  public:
-  virtual void SetUp() override {
+  void SetUp() override {
     precert_chain_ =
         CreateCertificateListFromFile(GetTestCertsDirectory(),
                                       "ct-test-embedded-cert.pem",
diff --git a/net/cert/ct_serialization_unittest.cc b/net/cert/ct_serialization_unittest.cc
index ccf2d20..f908681 100644
--- a/net/cert/ct_serialization_unittest.cc
+++ b/net/cert/ct_serialization_unittest.cc
@@ -20,7 +20,7 @@
 
 class CtSerializationTest : public ::testing::Test {
  public:
-  virtual void SetUp() override {
+  void SetUp() override {
     test_digitally_signed_ = ct::GetTestDigitallySigned();
   }
 
diff --git a/net/cert/ev_root_ca_metadata_unittest.cc b/net/cert/ev_root_ca_metadata_unittest.cc
index 90f4fa1..e26603c 100644
--- a/net/cert/ev_root_ca_metadata_unittest.cc
+++ b/net/cert/ev_root_ca_metadata_unittest.cc
@@ -94,9 +94,7 @@
 
 class EVRootCAMetadataTest : public testing::Test {
  protected:
-  virtual void SetUp() override {
-    ASSERT_TRUE(ev_oid_data.Init());
-  }
+  void SetUp() override { ASSERT_TRUE(ev_oid_data.Init()); }
 
   EVOidData ev_oid_data;
 };
diff --git a/net/cert/multi_log_ct_verifier_unittest.cc b/net/cert/multi_log_ct_verifier_unittest.cc
index 17a670c..433901b 100644
--- a/net/cert/multi_log_ct_verifier_unittest.cc
+++ b/net/cert/multi_log_ct_verifier_unittest.cc
@@ -37,7 +37,7 @@
 
 class MultiLogCTVerifierTest : public ::testing::Test {
  public:
-  virtual void SetUp() override {
+  void SetUp() override {
     scoped_ptr<CTLogVerifier> log(
         CTLogVerifier::Create(ct::GetTestPublicKey(), kLogDescription));
     ASSERT_TRUE(log);
diff --git a/net/cert/multi_threaded_cert_verifier_unittest.cc b/net/cert/multi_threaded_cert_verifier_unittest.cc
index bac47b0..a3464e0 100644
--- a/net/cert/multi_threaded_cert_verifier_unittest.cc
+++ b/net/cert/multi_threaded_cert_verifier_unittest.cc
@@ -67,7 +67,7 @@
 class MultiThreadedCertVerifierTest : public ::testing::Test {
  public:
   MultiThreadedCertVerifierTest() : verifier_(new MockCertVerifyProc()) {}
-  virtual ~MultiThreadedCertVerifierTest() {}
+  ~MultiThreadedCertVerifierTest() override {}
 
  protected:
   MultiThreadedCertVerifier verifier_;
diff --git a/net/cert/nss_cert_database.cc b/net/cert/nss_cert_database.cc
index 2c40e15..8e9c692 100644
--- a/net/cert/nss_cert_database.cc
+++ b/net/cert/nss_cert_database.cc
@@ -48,18 +48,18 @@
   explicit CertNotificationForwarder(CertDatabase* cert_db)
       : cert_db_(cert_db) {}
 
-  virtual ~CertNotificationForwarder() {}
+  ~CertNotificationForwarder() override {}
 
   // NSSCertDatabase::Observer implementation:
-  virtual void OnCertAdded(const X509Certificate* cert) override {
+  void OnCertAdded(const X509Certificate* cert) override {
     cert_db_->NotifyObserversOfCertAdded(cert);
   }
 
-  virtual void OnCertRemoved(const X509Certificate* cert) override {
+  void OnCertRemoved(const X509Certificate* cert) override {
     cert_db_->NotifyObserversOfCertRemoved(cert);
   }
 
-  virtual void OnCACertChanged(const X509Certificate* cert) override {
+  void OnCACertChanged(const X509Certificate* cert) override {
     cert_db_->NotifyObserversOfCACertChanged(cert);
   }
 
diff --git a/net/cert/nss_cert_database_unittest.cc b/net/cert/nss_cert_database_unittest.cc
index 6007452..c5f05b5 100644
--- a/net/cert/nss_cert_database_unittest.cc
+++ b/net/cert/nss_cert_database_unittest.cc
@@ -55,7 +55,7 @@
 
 class CertDatabaseNSSTest : public testing::Test {
  public:
-  virtual void SetUp() {
+  void SetUp() override {
     ASSERT_TRUE(test_nssdb_.is_open());
     cert_db_.reset(new NSSCertDatabase(
         crypto::ScopedPK11Slot(
@@ -68,7 +68,7 @@
     EXPECT_EQ(0U, ListCerts().size());
   }
 
-  virtual void TearDown() {
+  void TearDown() override {
     // Run the message loop to process any observer callbacks (e.g. for the
     // ClientSocketFactory singleton) so that the scoped ref ptrs created in
     // NSSCertDatabase::NotifyObservers* get released.
diff --git a/net/cert/signed_certificate_timestamp_unittest.cc b/net/cert/signed_certificate_timestamp_unittest.cc
index dc60a27..393725d 100644
--- a/net/cert/signed_certificate_timestamp_unittest.cc
+++ b/net/cert/signed_certificate_timestamp_unittest.cc
@@ -20,7 +20,7 @@
 
 class SignedCertificateTimestampTest : public ::testing::Test {
  public:
-  virtual void SetUp() override {
+  void SetUp() override {
     GetX509CertSCT(&sample_sct_);
     sample_sct_->origin = SignedCertificateTimestamp::SCT_FROM_OCSP_RESPONSE;
     sample_sct_->log_description = kLogDescription;
diff --git a/net/cert/x509_cert_types_unittest.cc b/net/cert/x509_cert_types_unittest.cc
index 38fd3e9..a6645c0 100644
--- a/net/cert/x509_cert_types_unittest.cc
+++ b/net/cert/x509_cert_types_unittest.cc
@@ -210,9 +210,7 @@
 class X509CertTypesDateTest : public testing::TestWithParam<CertDateTestData> {
   public:
     virtual ~X509CertTypesDateTest() {}
-    virtual void SetUp() {
-      test_data_ = GetParam();
-    }
+    void SetUp() override { test_data_ = GetParam(); }
 
   protected:
     CertDateTestData test_data_;
diff --git a/net/cert/x509_certificate_unittest.cc b/net/cert/x509_certificate_unittest.cc
index 3398510..652a5fb 100644
--- a/net/cert/x509_certificate_unittest.cc
+++ b/net/cert/x509_certificate_unittest.cc
@@ -867,10 +867,8 @@
     : public testing::TestWithParam<CertificateFormatTestData> {
  public:
   virtual ~X509CertificateParseTest() {}
-  virtual void SetUp() {
-    test_data_ = GetParam();
-  }
-  virtual void TearDown() {}
+  void SetUp() override { test_data_ = GetParam(); }
+  void TearDown() override {}
 
  protected:
   CertificateFormatTestData test_data_;
diff --git a/net/cookies/canonical_cookie.cc b/net/cookies/canonical_cookie.cc
index 54a9565..f0b3b3f 100644
--- a/net/cookies/canonical_cookie.cc
+++ b/net/cookies/canonical_cookie.cc
@@ -394,7 +394,7 @@
       static_cast<int64>(creation_date_.ToTimeT()));
 }
 
-CanonicalCookie* CanonicalCookie::Duplicate() {
+CanonicalCookie* CanonicalCookie::Duplicate() const {
   CanonicalCookie* cc = new CanonicalCookie();
   cc->source_ = source_;
   cc->name_ = name_;
diff --git a/net/cookies/canonical_cookie.h b/net/cookies/canonical_cookie.h
index a556740..19ed388 100644
--- a/net/cookies/canonical_cookie.h
+++ b/net/cookies/canonical_cookie.h
@@ -126,7 +126,7 @@
   std::string DebugString() const;
 
   // Returns a duplicate of this cookie.
-  CanonicalCookie* Duplicate();
+  CanonicalCookie* Duplicate() const;
 
   // Returns the cookie source when cookies are set for |url|. This function
   // is public for unit test purposes only.
diff --git a/net/cookies/cookie_monster.cc b/net/cookies/cookie_monster.cc
index dd64cce..52b455b 100644
--- a/net/cookies/cookie_monster.cc
+++ b/net/cookies/cookie_monster.cc
@@ -63,7 +63,6 @@
 #include "net/cookies/canonical_cookie.h"
 #include "net/cookies/cookie_util.h"
 #include "net/cookies/parsed_cookie.h"
-#include "url/gurl.h"
 
 using base::Time;
 using base::TimeDelta;
@@ -307,6 +306,11 @@
   return cookie_line;
 }
 
+void RunAsync(scoped_refptr<base::TaskRunner> proxy,
+              const CookieStore::CookieChangedCallback& callback) {
+  proxy->PostTask(FROM_HERE, callback);
+}
+
 }  // namespace
 
 CookieMonster::CookieMonster(PersistentCookieStore* store,
@@ -903,7 +907,6 @@
       new SetCookieWithDetailsTask(this, url, name, value, domain, path,
                                    expiration_time, secure, http_only, priority,
                                    callback);
-
   DoCookieTaskForURL(task, url);
 }
 
@@ -1813,6 +1816,7 @@
                                        const CookieOptions& options) {
   const std::string key(GetKey((*cc)->Domain()));
   bool already_expired = (*cc)->IsExpired(creation_time);
+
   if (DeleteAnyEquivalentCookie(key, **cc, options.exclude_httponly(),
                                 already_expired)) {
     VLOG(kVlogSetCookies) << "SetCookie() not clobbering httponly cookie";
@@ -1831,7 +1835,11 @@
           ((*cc)->ExpiryDate() - creation_time).InMinutes());
     }
 
-    InternalInsertCookie(key, cc->release(), true);
+    {
+      CanonicalCookie cookie = *(cc->get());
+      InternalInsertCookie(key, cc->release(), true);
+      RunCallbacks(cookie);
+    }
   } else {
     VLOG(kVlogSetCookies) << "SetCookie() not storing already expired cookie.";
   }
@@ -1896,6 +1904,7 @@
       delegate_->OnCookieChanged(*cc, true, mapping.cause);
   }
   cookies_.erase(it);
+  RunCallbacks(*cc);
   delete cc;
 }
 
@@ -2303,4 +2312,36 @@
   return loaded_;
 }
 
+scoped_ptr<CookieStore::CookieChangedSubscription>
+CookieMonster::AddCallbackForCookie(
+    const GURL& gurl,
+    const std::string& name,
+    const CookieChangedCallback& callback) {
+  base::AutoLock autolock(lock_);
+  std::pair<GURL, std::string> key(gurl, name);
+  if (hook_map_.count(key) == 0)
+    hook_map_[key] = make_linked_ptr(new CookieChangedCallbackList());
+  return hook_map_[key]->Add(base::Bind(
+      &RunAsync, base::MessageLoopProxy::current(), callback));
+}
+
+void CookieMonster::RunCallbacks(const CanonicalCookie& cookie) {
+  lock_.AssertAcquired();
+  CookieOptions opts;
+  opts.set_include_httponly();
+  // Note that the callbacks in hook_map_ are wrapped with MakeAsync(), so they
+  // are guaranteed to not take long - they just post a RunAsync task back to
+  // the appropriate thread's message loop and return. It is important that this
+  // method not run user-supplied callbacks directly, since the CookieMonster
+  // lock is held and it is easy to accidentally introduce deadlocks.
+  for (CookieChangedHookMap::iterator it = hook_map_.begin();
+       it != hook_map_.end(); ++it) {
+    std::pair<GURL, std::string> key = it->first;
+    if (cookie.IncludeForRequestURL(key.first, opts) &&
+        cookie.Name() == key.second) {
+      it->second->Notify();
+    }
+  }
+}
+
 }  // namespace net
diff --git a/net/cookies/cookie_monster.h b/net/cookies/cookie_monster.h
index 741c22e..a41c391 100644
--- a/net/cookies/cookie_monster.h
+++ b/net/cookies/cookie_monster.h
@@ -18,6 +18,7 @@
 #include "base/basictypes.h"
 #include "base/callback_forward.h"
 #include "base/gtest_prod_util.h"
+#include "base/memory/linked_ptr.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/scoped_ptr.h"
 #include "base/synchronization/lock.h"
@@ -26,8 +27,7 @@
 #include "net/cookies/canonical_cookie.h"
 #include "net/cookies/cookie_constants.h"
 #include "net/cookies/cookie_store.h"
-
-class GURL;
+#include "url/gurl.h"
 
 namespace base {
 class Histogram;
@@ -315,6 +315,11 @@
   // See comment on keys before the CookieMap typedef.
   std::string GetKey(const std::string& domain) const;
 
+  scoped_ptr<CookieChangedSubscription> AddCallbackForCookie(
+      const GURL& url,
+      const std::string& name,
+      const CookieChangedCallback& callback) override;
+
   bool loaded();
 
  private:
@@ -695,6 +700,12 @@
   // instance are reset back to defaults.
   static bool default_enable_file_scheme_;
 
+  typedef std::map<std::pair<GURL, std::string>,
+                   linked_ptr<CookieChangedCallbackList>> CookieChangedHookMap;
+  CookieChangedHookMap hook_map_;
+
+  void RunCallbacks(const CanonicalCookie& cookie);
+
   DISALLOW_COPY_AND_ASSIGN(CookieMonster);
 };
 
diff --git a/net/cookies/cookie_monster_unittest.cc b/net/cookies/cookie_monster_unittest.cc
index 5c76e8a..127e594 100644
--- a/net/cookies/cookie_monster_unittest.cc
+++ b/net/cookies/cookie_monster_unittest.cc
@@ -12,6 +12,7 @@
 #include "base/bind.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/scoped_ptr.h"
+#include "base/memory/scoped_vector.h"
 #include "base/message_loop/message_loop.h"
 #include "base/metrics/histogram.h"
 #include "base/metrics/histogram_samples.h"
@@ -2737,4 +2738,119 @@
   EXPECT_EQ("foo=bar; hello=world", GetCookies(cm.get(), url));
 }
 
+class CookieMonsterNotificationTest : public CookieMonsterTest {
+ public:
+  CookieMonsterNotificationTest()
+      : test_url_("http://www.google.com/foo"),
+        store_(new MockPersistentCookieStore),
+        monster_(new CookieMonster(store_.get(), NULL)) {}
+
+  ~CookieMonsterNotificationTest() override {}
+
+  CookieMonster* monster() { return monster_.get(); }
+
+ protected:
+  const GURL test_url_;
+
+ private:
+  scoped_refptr<MockPersistentCookieStore> store_;
+  scoped_refptr<CookieMonster> monster_;
+};
+
+void CountCalls(int *calls) {
+  (*calls)++;
+}
+
+TEST_F(CookieMonsterNotificationTest, NoNotifyWithNoCookie) {
+  int calls = 0;
+  scoped_ptr<CookieStore::CookieChangedSubscription> sub(
+      monster()->AddCallbackForCookie(test_url_, "abc",
+          base::Bind(&CountCalls, &calls)));
+  base::MessageLoop::current()->RunUntilIdle();
+  EXPECT_EQ(0, calls);
+}
+
+TEST_F(CookieMonsterNotificationTest, NoNotifyWithInitialCookie) {
+  int calls = 0;
+  SetCookie(monster(), test_url_, "abc=def");
+  base::MessageLoop::current()->RunUntilIdle();
+  scoped_ptr<CookieStore::CookieChangedSubscription> sub(
+      monster()->AddCallbackForCookie(test_url_, "abc",
+          base::Bind(&CountCalls, &calls)));
+  base::MessageLoop::current()->RunUntilIdle();
+  EXPECT_EQ(0, calls);
+}
+
+TEST_F(CookieMonsterNotificationTest, NotifyOnSet) {
+  int calls = 0;
+  scoped_ptr<CookieStore::CookieChangedSubscription> sub(
+      monster()->AddCallbackForCookie(test_url_, "abc",
+          base::Bind(&CountCalls, &calls)));
+  SetCookie(monster(), test_url_, "abc=def");
+  base::MessageLoop::current()->RunUntilIdle();
+  EXPECT_EQ(1, calls);
+}
+
+TEST_F(CookieMonsterNotificationTest, NotifyOnDelete) {
+  int calls = 0;
+  scoped_ptr<CookieStore::CookieChangedSubscription> sub(
+      monster()->AddCallbackForCookie(test_url_, "abc",
+          base::Bind(&CountCalls, &calls)));
+  SetCookie(monster(), test_url_, "abc=def");
+  base::MessageLoop::current()->RunUntilIdle();
+  EXPECT_EQ(1, calls);
+  DeleteCookie(monster(), test_url_, "abc");
+  base::MessageLoop::current()->RunUntilIdle();
+  EXPECT_EQ(2, calls);
+}
+
+TEST_F(CookieMonsterNotificationTest, NotifyOnUpdate) {
+  int calls = 0;
+  scoped_ptr<CookieStore::CookieChangedSubscription> sub(
+      monster()->AddCallbackForCookie(test_url_, "abc",
+          base::Bind(&CountCalls, &calls)));
+  SetCookie(monster(), test_url_, "abc=def");
+  base::MessageLoop::current()->RunUntilIdle();
+  EXPECT_EQ(1, calls);
+  // Replacing an existing cookie is actually a two-phase delete + set
+  // operation, so we get an extra notification. :(
+  SetCookie(monster(), test_url_, "abc=ghi");
+  base::MessageLoop::current()->RunUntilIdle();
+  EXPECT_EQ(3, calls);
+}
+
+TEST_F(CookieMonsterNotificationTest, MultipleNotifies) {
+  int calls0 = 0;
+  int calls1 = 0;
+  scoped_ptr<CookieStore::CookieChangedSubscription> sub0(
+      monster()->AddCallbackForCookie(test_url_, "abc",
+          base::Bind(&CountCalls, &calls0)));
+  scoped_ptr<CookieStore::CookieChangedSubscription> sub1(
+      monster()->AddCallbackForCookie(test_url_, "def",
+          base::Bind(&CountCalls, &calls1)));
+  SetCookie(monster(), test_url_, "abc=def");
+  base::MessageLoop::current()->RunUntilIdle();
+  EXPECT_EQ(1, calls0);
+  EXPECT_EQ(0, calls1);
+  SetCookie(monster(), test_url_, "def=abc");
+  base::MessageLoop::current()->RunUntilIdle();
+  EXPECT_EQ(1, calls0);
+  EXPECT_EQ(1, calls1);
+}
+
+TEST_F(CookieMonsterNotificationTest, MultipleSameNotifies) {
+  int calls0 = 0;
+  int calls1 = 0;
+  scoped_ptr<CookieStore::CookieChangedSubscription> sub0(
+      monster()->AddCallbackForCookie(test_url_, "abc",
+          base::Bind(&CountCalls, &calls0)));
+  scoped_ptr<CookieStore::CookieChangedSubscription> sub1(
+      monster()->AddCallbackForCookie(test_url_, "abc",
+          base::Bind(&CountCalls, &calls1)));
+  SetCookie(monster(), test_url_, "abc=def");
+  base::MessageLoop::current()->RunUntilIdle();
+  EXPECT_EQ(1, calls0);
+  EXPECT_EQ(1, calls1);
+}
+
 }  // namespace net
diff --git a/net/cookies/cookie_store.h b/net/cookies/cookie_store.h
index b2552a6..e6e4820 100644
--- a/net/cookies/cookie_store.h
+++ b/net/cookies/cookie_store.h
@@ -12,6 +12,7 @@
 
 #include "base/basictypes.h"
 #include "base/callback.h"
+#include "base/callback_list.h"
 #include "base/memory/ref_counted.h"
 #include "base/time/time.h"
 #include "net/base/net_export.h"
@@ -33,6 +34,9 @@
   typedef base::Callback<void(const std::string& cookie)> GetCookiesCallback;
   typedef base::Callback<void(bool success)> SetCookiesCallback;
   typedef base::Callback<void(int num_deleted)> DeleteCallback;
+  typedef base::Closure CookieChangedCallback;
+  typedef base::CallbackList<void(void)> CookieChangedCallbackList;
+  typedef CookieChangedCallbackList::Subscription CookieChangedSubscription;
 
   // Sets a single cookie.  Expects a cookie line, like "a=1; domain=b.com".
   //
@@ -91,6 +95,20 @@
   // Returns the underlying CookieMonster.
   virtual CookieMonster* GetCookieMonster() = 0;
 
+  // Add a callback to be notified when the set of cookies named |name| that
+  // would be sent for a request to |url| changes. The returned handle is
+  // guaranteed not to hold a hard reference to the CookieStore object.
+  //
+  // Note that this method consumes memory and CPU per (url, name) pair ever
+  // registered that are still consumed even after all subscriptions for that
+  // (url, name) pair are removed. If this method ever needs to support an
+  // unbounded amount of such pairs, this contract needs to change and
+  // implementors need to be improved to not behave this way.
+  virtual scoped_ptr<CookieChangedSubscription> AddCallbackForCookie(
+      const GURL& url,
+      const std::string& name,
+      const CookieChangedCallback& callback) = 0;
+
  protected:
   friend class base::RefCountedThreadSafe<CookieStore>;
   CookieStore();
diff --git a/net/cookies/cookie_store_test_helpers.cc b/net/cookies/cookie_store_test_helpers.cc
index fdf2c1f..bcf8c89 100644
--- a/net/cookies/cookie_store_test_helpers.cc
+++ b/net/cookies/cookie_store_test_helpers.cc
@@ -135,4 +135,13 @@
   return cookie_monster_.get();
 }
 
+scoped_ptr<CookieStore::CookieChangedSubscription>
+DelayedCookieMonster::AddCallbackForCookie(
+    const GURL& url,
+    const std::string& name,
+    const CookieChangedCallback& callback) {
+  ADD_FAILURE();
+  return scoped_ptr<CookieStore::CookieChangedSubscription>();
+}
+
 }  // namespace net
diff --git a/net/cookies/cookie_store_test_helpers.h b/net/cookies/cookie_store_test_helpers.h
index 2b8b245..760b847 100644
--- a/net/cookies/cookie_store_test_helpers.h
+++ b/net/cookies/cookie_store_test_helpers.h
@@ -65,6 +65,10 @@
 
   CookieMonster* GetCookieMonster() override;
 
+  scoped_ptr<CookieStore::CookieChangedSubscription>
+  AddCallbackForCookie(const GURL& url, const std::string& name,
+                       const CookieChangedCallback& callback) override;
+
  private:
 
   // Be called immediately from CookieMonster.
diff --git a/net/disk_cache/cache_util_unittest.cc b/net/disk_cache/cache_util_unittest.cc
index b755815..073c152 100644
--- a/net/disk_cache/cache_util_unittest.cc
+++ b/net/disk_cache/cache_util_unittest.cc
@@ -12,7 +12,7 @@
 
 class CacheUtilTest : public PlatformTest {
  public:
-  virtual void SetUp() {
+  void SetUp() override {
     PlatformTest::SetUp();
     ASSERT_TRUE(tmp_dir_.CreateUniqueTempDir());
     cache_dir_ = tmp_dir_.path().Append(FILE_PATH_LITERAL("Cache"));
diff --git a/net/disk_cache/disk_cache_test_base.h b/net/disk_cache/disk_cache_test_base.h
index ce36f92..ef136f4 100644
--- a/net/disk_cache/disk_cache_test_base.h
+++ b/net/disk_cache/disk_cache_test_base.h
@@ -38,7 +38,7 @@
 class DiskCacheTest : public PlatformTest {
  protected:
   DiskCacheTest();
-  virtual ~DiskCacheTest();
+  ~DiskCacheTest() override;
 
   // Copies a set of cache files from the data folder to the test folder.
   bool CopyTestCache(const std::string& name);
@@ -46,7 +46,7 @@
   // Deletes the contents of |cache_path_|.
   bool CleanupCacheDir();
 
-  virtual void TearDown() override;
+  void TearDown() override;
 
   base::FilePath cache_path_;
 
@@ -70,7 +70,7 @@
   };
 
   DiskCacheTestWithCache();
-  virtual ~DiskCacheTestWithCache();
+  ~DiskCacheTestWithCache() override;
 
   void CreateBackend(uint32 flags, base::Thread* thread);
 
@@ -154,7 +154,7 @@
   void AddDelay();
 
   // DiskCacheTest:
-  virtual void TearDown() override;
+  void TearDown() override;
 
   // cache_ will always have a valid object, regardless of how the cache was
   // initialized. The implementation pointers can be NULL.
diff --git a/net/disk_cache/simple/simple_index_unittest.cc b/net/disk_cache/simple/simple_index_unittest.cc
index dc63989..e5d0830 100644
--- a/net/disk_cache/simple/simple_index_unittest.cc
+++ b/net/disk_cache/simple/simple_index_unittest.cc
@@ -101,7 +101,7 @@
         base::StringPrintf("key%d", static_cast<int>(hash_index)));
   }
 
-  virtual void SetUp() override {
+  void SetUp() override {
     scoped_ptr<MockSimpleIndexFile> index_file(new MockSimpleIndexFile());
     index_file_ = index_file->AsWeakPtr();
     index_.reset(
diff --git a/net/dns/dns_config_service_unittest.cc b/net/dns/dns_config_service_unittest.cc
index 74020c8..45a803d 100644
--- a/net/dns/dns_config_service_unittest.cc
+++ b/net/dns/dns_config_service_unittest.cc
@@ -176,7 +176,7 @@
     return hosts;
   }
 
-  virtual void SetUp() override {
+  void SetUp() override {
     quit_on_config_ = false;
 
     service_.reset(new TestDnsConfigService());
diff --git a/net/dns/dns_transaction_unittest.cc b/net/dns/dns_transaction_unittest.cc
index 5581f22..f22478c 100644
--- a/net/dns/dns_transaction_unittest.cc
+++ b/net/dns/dns_transaction_unittest.cc
@@ -441,7 +441,7 @@
     }
   }
 
-  virtual void SetUp() override {
+  void SetUp() override {
     // By default set one server,
     ConfigureNumServers(1);
     // and no retransmissions,
@@ -451,7 +451,7 @@
     ConfigureFactory();
   }
 
-  virtual void TearDown() override {
+  void TearDown() override {
     // Check that all socket data was at least written to.
     for (size_t i = 0; i < socket_data_.size(); ++i) {
       EXPECT_TRUE(socket_data_[i]->was_written()) << i;
diff --git a/net/dns/host_resolver_impl_unittest.cc b/net/dns/host_resolver_impl_unittest.cc
index 017625f..7b6a391 100644
--- a/net/dns/host_resolver_impl_unittest.cc
+++ b/net/dns/host_resolver_impl_unittest.cc
@@ -460,11 +460,9 @@
   };
 
   // testing::Test implementation:
-  virtual void SetUp() override {
-    CreateResolver();
-  }
+  void SetUp() override { CreateResolver(); }
 
-  virtual void TearDown() override {
+  void TearDown() override {
     if (resolver_.get())
       EXPECT_EQ(0u, resolver_->num_running_dispatcher_jobs_for_tests());
     EXPECT_FALSE(proc_->HasBlockedRequests());
@@ -1339,7 +1337,7 @@
 
  protected:
   // testing::Test implementation:
-  virtual void SetUp() override {
+  void SetUp() override {
     AddDnsRule("nx", dns_protocol::kTypeA, MockDnsClientRule::FAIL, false);
     AddDnsRule("nx", dns_protocol::kTypeAAAA, MockDnsClientRule::FAIL, false);
     AddDnsRule("ok", dns_protocol::kTypeA, MockDnsClientRule::OK, false);
diff --git a/net/dns/mdns_client_impl.h b/net/dns/mdns_client_impl.h
index b6f8b93..0dfedf9 100644
--- a/net/dns/mdns_client_impl.h
+++ b/net/dns/mdns_client_impl.h
@@ -26,10 +26,9 @@
 class MDnsSocketFactoryImpl : public MDnsSocketFactory {
  public:
   MDnsSocketFactoryImpl() {};
-  virtual ~MDnsSocketFactoryImpl() {};
+  ~MDnsSocketFactoryImpl() override{};
 
-  virtual void CreateSockets(
-      ScopedVector<DatagramServerSocket>* sockets) override;
+  void CreateSockets(ScopedVector<DatagramServerSocket>* sockets) override;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(MDnsSocketFactoryImpl);
@@ -111,7 +110,7 @@
   class Core : public base::SupportsWeakPtr<Core>, MDnsConnection::Delegate {
    public:
     explicit Core(MDnsClientImpl* client);
-    virtual ~Core();
+    ~Core() override;
 
     // Initialize the core. Returns true on success.
     bool Init(MDnsSocketFactory* socket_factory);
@@ -128,9 +127,9 @@
                     std::vector<const RecordParsed*>* records) const;
 
     // Parse the response and alert relevant listeners.
-    virtual void HandlePacket(DnsResponse* response, int bytes_read) override;
+    void HandlePacket(DnsResponse* response, int bytes_read) override;
 
-    virtual void OnConnectionError(int error) override;
+    void OnConnectionError(int error) override;
 
    private:
     typedef std::pair<std::string, uint16> ListenerKey;
@@ -170,23 +169,23 @@
   };
 
   MDnsClientImpl();
-  virtual ~MDnsClientImpl();
+  ~MDnsClientImpl() override;
 
   // MDnsClient implementation:
-  virtual scoped_ptr<MDnsListener> CreateListener(
+  scoped_ptr<MDnsListener> CreateListener(
       uint16 rrtype,
       const std::string& name,
       MDnsListener::Delegate* delegate) override;
 
-  virtual scoped_ptr<MDnsTransaction> CreateTransaction(
+  scoped_ptr<MDnsTransaction> CreateTransaction(
       uint16 rrtype,
       const std::string& name,
       int flags,
       const MDnsTransaction::ResultCallback& callback) override;
 
-  virtual bool StartListening(MDnsSocketFactory* socket_factory) override;
-  virtual void StopListening() override;
-  virtual bool IsListening() const override;
+  bool StartListening(MDnsSocketFactory* socket_factory) override;
+  void StopListening() override;
+  bool IsListening() const override;
 
   Core* core() { return core_.get(); }
 
@@ -204,17 +203,17 @@
                    MDnsListener::Delegate* delegate,
                    MDnsClientImpl* client);
 
-  virtual ~MDnsListenerImpl();
+  ~MDnsListenerImpl() override;
 
   // MDnsListener implementation:
-  virtual bool Start() override;
+  bool Start() override;
 
   // Actively refresh any received records.
-  virtual void SetActiveRefresh(bool active_refresh) override;
+  void SetActiveRefresh(bool active_refresh) override;
 
-  virtual const std::string& GetName() const override;
+  const std::string& GetName() const override;
 
-  virtual uint16 GetType() const override;
+  uint16 GetType() const override;
 
   MDnsListener::Delegate* delegate() { return delegate_; }
 
@@ -252,20 +251,20 @@
                       int flags,
                       const MDnsTransaction::ResultCallback& callback,
                       MDnsClientImpl* client);
-  virtual ~MDnsTransactionImpl();
+  ~MDnsTransactionImpl() override;
 
   // MDnsTransaction implementation:
-  virtual bool Start() override;
+  bool Start() override;
 
-  virtual const std::string& GetName() const override;
-  virtual uint16 GetType() const override;
+  const std::string& GetName() const override;
+  uint16 GetType() const override;
 
   // MDnsListener::Delegate implementation:
-  virtual void OnRecordUpdate(MDnsListener::UpdateType update,
-                              const RecordParsed* record) override;
-  virtual void OnNsecRecord(const std::string& name, unsigned type) override;
+  void OnRecordUpdate(MDnsListener::UpdateType update,
+                      const RecordParsed* record) override;
+  void OnNsecRecord(const std::string& name, unsigned type) override;
 
-  virtual void OnCachePurged() override;
+  void OnCachePurged() override;
 
  private:
   bool is_active() { return !callback_.is_null(); }
diff --git a/net/dns/mdns_client_unittest.cc b/net/dns/mdns_client_unittest.cc
index 4b2e7d5..ba03082 100644
--- a/net/dns/mdns_client_unittest.cc
+++ b/net/dns/mdns_client_unittest.cc
@@ -1056,8 +1056,7 @@
 // This is a simplifying assumption based on the way the code works now.
 class SimpleMockSocketFactory : public MDnsSocketFactory {
  public:
-  virtual void CreateSockets(
-      ScopedVector<DatagramServerSocket>* sockets) override {
+  void CreateSockets(ScopedVector<DatagramServerSocket>* sockets) override {
     sockets->clear();
     sockets->swap(sockets_);
   }
@@ -1160,7 +1159,7 @@
 
 class MDnsConnectionSendTest : public MDnsConnectionTest {
  protected:
-  virtual void SetUp() override {
+  void SetUp() override {
     MDnsConnectionTest::SetUp();
     EXPECT_CALL(*socket_ipv4_, RecvFrom(_, _, _, _))
         .WillOnce(Return(ERR_IO_PENDING));
diff --git a/net/dns/record_rdata.h b/net/dns/record_rdata.h
index 09a082f..47ba177 100644
--- a/net/dns/record_rdata.h
+++ b/net/dns/record_rdata.h
@@ -44,12 +44,12 @@
  public:
   static const uint16 kType = dns_protocol::kTypeSRV;
 
-  virtual ~SrvRecordRdata();
+  ~SrvRecordRdata() override;
   static scoped_ptr<SrvRecordRdata> Create(const base::StringPiece& data,
                                            const DnsRecordParser& parser);
 
-  virtual bool IsEqual(const RecordRdata* other) const override;
-  virtual uint16 Type() const override;
+  bool IsEqual(const RecordRdata* other) const override;
+  uint16 Type() const override;
 
   uint16 priority() const { return priority_; }
   uint16 weight() const { return weight_; }
@@ -75,11 +75,11 @@
  public:
   static const uint16 kType = dns_protocol::kTypeA;
 
-  virtual ~ARecordRdata();
+  ~ARecordRdata() override;
   static scoped_ptr<ARecordRdata> Create(const base::StringPiece& data,
                                          const DnsRecordParser& parser);
-  virtual bool IsEqual(const RecordRdata* other) const override;
-  virtual uint16 Type() const override;
+  bool IsEqual(const RecordRdata* other) const override;
+  uint16 Type() const override;
 
   const IPAddressNumber& address() const { return address_; }
 
@@ -97,11 +97,11 @@
  public:
   static const uint16 kType = dns_protocol::kTypeAAAA;
 
-  virtual ~AAAARecordRdata();
+  ~AAAARecordRdata() override;
   static scoped_ptr<AAAARecordRdata> Create(const base::StringPiece& data,
                                          const DnsRecordParser& parser);
-  virtual bool IsEqual(const RecordRdata* other) const override;
-  virtual uint16 Type() const override;
+  bool IsEqual(const RecordRdata* other) const override;
+  uint16 Type() const override;
 
   const IPAddressNumber& address() const { return address_; }
 
@@ -119,11 +119,11 @@
  public:
   static const uint16 kType = dns_protocol::kTypeCNAME;
 
-  virtual ~CnameRecordRdata();
+  ~CnameRecordRdata() override;
   static scoped_ptr<CnameRecordRdata> Create(const base::StringPiece& data,
                                              const DnsRecordParser& parser);
-  virtual bool IsEqual(const RecordRdata* other) const override;
-  virtual uint16 Type() const override;
+  bool IsEqual(const RecordRdata* other) const override;
+  uint16 Type() const override;
 
   std::string cname() const { return cname_; }
 
@@ -141,11 +141,11 @@
  public:
   static const uint16 kType = dns_protocol::kTypePTR;
 
-  virtual ~PtrRecordRdata();
+  ~PtrRecordRdata() override;
   static scoped_ptr<PtrRecordRdata> Create(const base::StringPiece& data,
                                            const DnsRecordParser& parser);
-  virtual bool IsEqual(const RecordRdata* other) const override;
-  virtual uint16 Type() const override;
+  bool IsEqual(const RecordRdata* other) const override;
+  uint16 Type() const override;
 
   std::string ptrdomain() const { return ptrdomain_; }
 
@@ -164,11 +164,11 @@
  public:
   static const uint16 kType = dns_protocol::kTypeTXT;
 
-  virtual ~TxtRecordRdata();
+  ~TxtRecordRdata() override;
   static scoped_ptr<TxtRecordRdata> Create(const base::StringPiece& data,
                                            const DnsRecordParser& parser);
-  virtual bool IsEqual(const RecordRdata* other) const override;
-  virtual uint16 Type() const override;
+  bool IsEqual(const RecordRdata* other) const override;
+  uint16 Type() const override;
 
   const std::vector<std::string>& texts() const { return texts_; }
 
@@ -188,11 +188,11 @@
  public:
   static const uint16 kType = dns_protocol::kTypeNSEC;
 
-  virtual ~NsecRecordRdata();
+  ~NsecRecordRdata() override;
   static scoped_ptr<NsecRecordRdata> Create(const base::StringPiece& data,
                                             const DnsRecordParser& parser);
-  virtual bool IsEqual(const RecordRdata* other) const override;
-  virtual uint16 Type() const override;
+  bool IsEqual(const RecordRdata* other) const override;
+  uint16 Type() const override;
 
   // Length of the bitmap in bits.
   unsigned bitmap_length() const { return bitmap_.size() * 8; }
diff --git a/net/dns/serial_worker_unittest.cc b/net/dns/serial_worker_unittest.cc
index 8e30e28..18b5464 100644
--- a/net/dns/serial_worker_unittest.cc
+++ b/net/dns/serial_worker_unittest.cc
@@ -96,12 +96,12 @@
   }
 
   // test::Test methods
-  virtual void SetUp() override {
+  void SetUp() override {
     message_loop_ = base::MessageLoop::current();
     worker_ = new TestSerialWorker(this);
   }
 
-  virtual void TearDown() override {
+  void TearDown() override {
     // Cancel the worker to catch if it makes a late DoWork call.
     worker_->Cancel();
     // Check if OnWork is stalled.
diff --git a/net/extras/sqlite/sqlite_channel_id_store_unittest.cc b/net/extras/sqlite/sqlite_channel_id_store_unittest.cc
index 92d77e9..17024f4 100644
--- a/net/extras/sqlite/sqlite_channel_id_store_unittest.cc
+++ b/net/extras/sqlite/sqlite_channel_id_store_unittest.cc
@@ -73,7 +73,7 @@
     return base::Time::FromUTCExploded(exploded_time);
   }
 
-  virtual void SetUp() {
+  void SetUp() override {
     ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
     store_ = new SQLiteChannelIDStore(
         temp_dir_.path().Append(kTestChannelIDFilename),
diff --git a/net/filter/gzip_filter_unittest.cc b/net/filter/gzip_filter_unittest.cc
index f3f9111..2f11e28 100644
--- a/net/filter/gzip_filter_unittest.cc
+++ b/net/filter/gzip_filter_unittest.cc
@@ -49,7 +49,7 @@
 // Mac, so this needs to be a PlatformTest.
 class GZipUnitTest : public PlatformTest {
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     PlatformTest::SetUp();
 
     deflate_encode_buffer_ = NULL;
@@ -89,7 +89,7 @@
     ASSERT_TRUE(gzip_encode_len_ <= kDefaultBufferSize);
   }
 
-  virtual void TearDown() {
+  void TearDown() override {
     delete[] deflate_encode_buffer_;
     deflate_encode_buffer_ = NULL;
 
diff --git a/net/http/disk_cache_based_quic_server_info.cc b/net/http/disk_cache_based_quic_server_info.cc
index 44332c9..ab6b6c8 100644
--- a/net/http/disk_cache_based_quic_server_info.cc
+++ b/net/http/disk_cache_based_quic_server_info.cc
@@ -101,6 +101,13 @@
   return ERR_IO_PENDING;
 }
 
+void DiskCacheBasedQuicServerInfo::CancelWaitForDataReadyCallback() {
+  DCHECK(CalledOnValidThread());
+
+  if (!user_callback_.is_null())
+    user_callback_.Reset();
+}
+
 bool DiskCacheBasedQuicServerInfo::IsDataReady() {
   return ready_;
 }
diff --git a/net/http/disk_cache_based_quic_server_info.h b/net/http/disk_cache_based_quic_server_info.h
index f904042..97fe95e 100644
--- a/net/http/disk_cache_based_quic_server_info.h
+++ b/net/http/disk_cache_based_quic_server_info.h
@@ -34,6 +34,7 @@
   // QuicServerInfo implementation.
   void Start() override;
   int WaitForDataReady(const CompletionCallback& callback) override;
+  void CancelWaitForDataReadyCallback() override;
   bool IsDataReady() override;
   bool IsReadyToPersist() override;
   void Persist() override;
diff --git a/net/http/disk_cache_based_quic_server_info_unittest.cc b/net/http/disk_cache_based_quic_server_info_unittest.cc
index 9bd7462..845fdc9 100644
--- a/net/http/disk_cache_based_quic_server_info_unittest.cc
+++ b/net/http/disk_cache_based_quic_server_info_unittest.cc
@@ -359,4 +359,40 @@
   RemoveMockTransaction(&kHostInfoTransaction1);
 }
 
+TEST(DiskCacheBasedQuicServerInfo, CancelWaitForDataReady) {
+  MockBlockingBackendFactory* factory = new MockBlockingBackendFactory();
+  MockHttpCache cache(factory);
+  TestCompletionCallback callback;
+  QuicServerId server_id("www.google.com", 443, true, PRIVACY_MODE_DISABLED);
+  scoped_ptr<QuicServerInfo> quic_server_info(
+      new DiskCacheBasedQuicServerInfo(server_id, cache.http_cache()));
+  EXPECT_FALSE(quic_server_info->IsDataReady());
+  quic_server_info->Start();
+  int rv = quic_server_info->WaitForDataReady(callback.callback());
+  EXPECT_EQ(ERR_IO_PENDING, rv);
+  // Now cancel the callback.
+  quic_server_info->CancelWaitForDataReadyCallback();
+  EXPECT_FALSE(quic_server_info->IsDataReady());
+  // Now complete the backend creation and let the callback run.
+  factory->FinishCreation();
+  EXPECT_TRUE(quic_server_info->IsDataReady());
+}
+
+TEST(DiskCacheBasedQuicServerInfo, CancelWaitForDataReadyButDataIsReady) {
+  MockHttpCache cache;
+  AddMockTransaction(&kHostInfoTransaction1);
+  TestCompletionCallback callback;
+
+  QuicServerId server_id("www.google.com", 443, true, PRIVACY_MODE_DISABLED);
+  scoped_ptr<QuicServerInfo> quic_server_info(
+      new DiskCacheBasedQuicServerInfo(server_id, cache.http_cache()));
+  EXPECT_FALSE(quic_server_info->IsDataReady());
+  quic_server_info->Start();
+  int rv = quic_server_info->WaitForDataReady(callback.callback());
+  quic_server_info->CancelWaitForDataReadyCallback();
+  EXPECT_EQ(OK, callback.GetResult(rv));
+  EXPECT_TRUE(quic_server_info->IsDataReady());
+  RemoveMockTransaction(&kHostInfoTransaction1);
+}
+
 }  // namespace net
diff --git a/net/http/http_auth_gssapi_posix.h b/net/http/http_auth_gssapi_posix.h
index 4091ba3..58f17a6 100644
--- a/net/http/http_auth_gssapi_posix.h
+++ b/net/http/http_auth_gssapi_posix.h
@@ -164,15 +164,15 @@
                             int* open) override;
 
  private:
-  typedef typeof(&gss_import_name) gss_import_name_type;
-  typedef typeof(&gss_release_name) gss_release_name_type;
-  typedef typeof(&gss_release_buffer) gss_release_buffer_type;
-  typedef typeof(&gss_display_name) gss_display_name_type;
-  typedef typeof(&gss_display_status) gss_display_status_type;
-  typedef typeof(&gss_init_sec_context) gss_init_sec_context_type;
-  typedef typeof(&gss_wrap_size_limit) gss_wrap_size_limit_type;
-  typedef typeof(&gss_delete_sec_context) gss_delete_sec_context_type;
-  typedef typeof(&gss_inquire_context) gss_inquire_context_type;
+  typedef decltype(&gss_import_name) gss_import_name_type;
+  typedef decltype(&gss_release_name) gss_release_name_type;
+  typedef decltype(&gss_release_buffer) gss_release_buffer_type;
+  typedef decltype(&gss_display_name) gss_display_name_type;
+  typedef decltype(&gss_display_status) gss_display_status_type;
+  typedef decltype(&gss_init_sec_context) gss_init_sec_context_type;
+  typedef decltype(&gss_wrap_size_limit) gss_wrap_size_limit_type;
+  typedef decltype(&gss_delete_sec_context) gss_delete_sec_context_type;
+  typedef decltype(&gss_inquire_context) gss_inquire_context_type;
 
   FRIEND_TEST_ALL_PREFIXES(HttpAuthGSSAPIPOSIXTest, GSSAPIStartup);
 
diff --git a/net/http/http_auth_handler_negotiate_unittest.cc b/net/http/http_auth_handler_negotiate_unittest.cc
index 64521a6..233597d 100644
--- a/net/http/http_auth_handler_negotiate_unittest.cc
+++ b/net/http/http_auth_handler_negotiate_unittest.cc
@@ -29,7 +29,7 @@
 
 class HttpAuthHandlerNegotiateTest : public PlatformTest {
  public:
-  virtual void SetUp() {
+  void SetUp() override {
     auth_library_ = new MockAuthLibrary();
     resolver_.reset(new MockHostResolver());
     resolver_->rules()->AddIPLiteralRule("alias", "10.0.0.2",
diff --git a/net/http/http_cache.cc b/net/http/http_cache.cc
index 61a12f6..d8008e1 100644
--- a/net/http/http_cache.cc
+++ b/net/http/http_cache.cc
@@ -282,7 +282,7 @@
 
 class HttpCache::QuicServerInfoFactoryAdaptor : public QuicServerInfoFactory {
  public:
-  QuicServerInfoFactoryAdaptor(HttpCache* http_cache)
+  explicit QuicServerInfoFactoryAdaptor(HttpCache* http_cache)
       : http_cache_(http_cache) {
   }
 
diff --git a/net/http/http_network_layer_unittest.cc b/net/http/http_network_layer_unittest.cc
index 7225001..ca04829 100644
--- a/net/http/http_network_layer_unittest.cc
+++ b/net/http/http_network_layer_unittest.cc
@@ -28,7 +28,7 @@
  protected:
   HttpNetworkLayerTest() : ssl_config_service_(new SSLConfigServiceDefaults) {}
 
-  virtual void SetUp() {
+  void SetUp() override {
     ConfigureTestDependencies(ProxyService::CreateDirect());
   }
 
diff --git a/net/http/http_network_session.cc b/net/http/http_network_session.cc
index 3e602ae..3ec607e 100644
--- a/net/http/http_network_session.cc
+++ b/net/http/http_network_session.cc
@@ -94,6 +94,7 @@
       enable_quic_port_selection(true),
       quic_always_require_handshake_confirmation(false),
       quic_disable_connection_pooling(false),
+      quic_load_server_info_timeout_ms(0),
       quic_clock(NULL),
       quic_random(NULL),
       quic_max_packet_length(kDefaultMaxPacketSize),
@@ -136,6 +137,7 @@
           params.enable_quic_port_selection,
           params.quic_always_require_handshake_confirmation,
           params.quic_disable_connection_pooling,
+          params.quic_load_server_info_timeout_ms,
           params.quic_connection_options),
       spdy_session_pool_(params.host_resolver,
                          params.ssl_config_service,
diff --git a/net/http/http_network_session.h b/net/http/http_network_session.h
index c084eda..a3f70aa 100644
--- a/net/http/http_network_session.h
+++ b/net/http/http_network_session.h
@@ -115,6 +115,7 @@
     bool enable_quic_port_selection;
     bool quic_always_require_handshake_confirmation;
     bool quic_disable_connection_pooling;
+    int quic_load_server_info_timeout_ms;
     HostPortPair origin_to_force_quic_on;
     QuicClock* quic_clock;  // Will be owned by QuicStreamFactory.
     QuicRandom* quic_random;
diff --git a/net/http/http_network_transaction.cc b/net/http/http_network_transaction.cc
index 532f9de..a7e248b 100644
--- a/net/http/http_network_transaction.cc
+++ b/net/http/http_network_transaction.cc
@@ -15,6 +15,7 @@
 #include "base/metrics/field_trial.h"
 #include "base/metrics/histogram.h"
 #include "base/metrics/stats_counters.h"
+#include "base/profiler/scoped_profile.h"
 #include "base/stl_util.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
@@ -597,7 +598,18 @@
 }
 
 void HttpNetworkTransaction::OnIOComplete(int result) {
+  // TODO(vadimt): Remove ScopedProfile below once crbug.com/424359 is fixed.
+  tracked_objects::ScopedProfile tracking_profile1(
+      FROM_HERE_WITH_EXPLICIT_FUNCTION(
+          "424359 HttpNetworkTransaction::OnIOComplete 1"));
+
   int rv = DoLoop(result);
+
+  // TODO(vadimt): Remove ScopedProfile below once crbug.com/424359 is fixed.
+  tracked_objects::ScopedProfile tracking_profile2(
+      FROM_HERE_WITH_EXPLICIT_FUNCTION(
+          "424359 HttpNetworkTransaction::OnIOComplete 2"));
+
   if (rv != ERR_IO_PENDING)
     DoCallback(rv);
 }
diff --git a/net/http/http_network_transaction_ssl_unittest.cc b/net/http/http_network_transaction_ssl_unittest.cc
index a84076e..ec52c35 100644
--- a/net/http/http_network_transaction_ssl_unittest.cc
+++ b/net/http/http_network_transaction_ssl_unittest.cc
@@ -58,7 +58,7 @@
 
 class HttpNetworkTransactionSSLTest : public testing::Test {
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     ssl_config_service_ = new TLS10SSLConfigService;
     session_params_.ssl_config_service = ssl_config_service_.get();
 
diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc
index e4a75b9..be94493 100644
--- a/net/http/http_network_transaction_unittest.cc
+++ b/net/http/http_network_transaction_unittest.cc
@@ -253,12 +253,12 @@
     LoadTimingInfo load_timing_info;
   };
 
-  virtual void SetUp() {
+  void SetUp() override {
     NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
     base::MessageLoop::current()->RunUntilIdle();
   }
 
-  virtual void TearDown() {
+  void TearDown() override {
     NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
     base::MessageLoop::current()->RunUntilIdle();
     // Empty the current queue.
diff --git a/net/http/http_response_body_drainer_unittest.cc b/net/http/http_response_body_drainer_unittest.cc
index cb2f1a9..371e9a7 100644
--- a/net/http/http_response_body_drainer_unittest.cc
+++ b/net/http/http_response_body_drainer_unittest.cc
@@ -213,7 +213,7 @@
         mock_stream_(new MockHttpStream(&result_waiter_)),
         drainer_(new HttpResponseBodyDrainer(mock_stream_)) {}
 
-  virtual ~HttpResponseBodyDrainerTest() {}
+  ~HttpResponseBodyDrainerTest() override {}
 
   HttpNetworkSession* CreateNetworkSession() const {
     HttpNetworkSession::Params params;
diff --git a/net/http/http_server_properties.h b/net/http/http_server_properties.h
index e171075..edf598f 100644
--- a/net/http/http_server_properties.h
+++ b/net/http/http_server_properties.h
@@ -15,6 +15,7 @@
 #include "net/base/net_export.h"
 #include "net/socket/next_proto.h"
 #include "net/spdy/spdy_framer.h"  // TODO(willchan): Reconsider this.
+#include "net/spdy/spdy_protocol.h"
 
 namespace net {
 
diff --git a/net/http/http_server_properties_manager_unittest.cc b/net/http/http_server_properties_manager_unittest.cc
index fcc253e..db58c92 100644
--- a/net/http/http_server_properties_manager_unittest.cc
+++ b/net/http/http_server_properties_manager_unittest.cc
@@ -87,7 +87,7 @@
  protected:
   HttpServerPropertiesManagerTest() {}
 
-  virtual void SetUp() override {
+  void SetUp() override {
     pref_service_.registry()->RegisterDictionaryPref(kTestHttpServerProperties);
     http_server_props_manager_.reset(
         new StrictMock<TestingHttpServerPropertiesManager>(
@@ -98,7 +98,7 @@
     base::RunLoop().RunUntilIdle();
   }
 
-  virtual void TearDown() override {
+  void TearDown() override {
     if (http_server_props_manager_.get())
       http_server_props_manager_->ShutdownOnPrefThread();
     base::RunLoop().RunUntilIdle();
diff --git a/net/http/transport_security_persister_unittest.cc b/net/http/transport_security_persister_unittest.cc
index b8dad5a..7bb2e99 100644
--- a/net/http/transport_security_persister_unittest.cc
+++ b/net/http/transport_security_persister_unittest.cc
@@ -23,11 +23,11 @@
   TransportSecurityPersisterTest() {
   }
 
-  virtual ~TransportSecurityPersisterTest() {
+  ~TransportSecurityPersisterTest() override {
     base::MessageLoopForIO::current()->RunUntilIdle();
   }
 
-  virtual void SetUp() override {
+  void SetUp() override {
     ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
     persister_.reset(new TransportSecurityPersister(
         &state_,
diff --git a/net/http/transport_security_state_static.certs b/net/http/transport_security_state_static.certs
index a6ca35b..525d05b 100644
--- a/net/http/transport_security_state_static.certs
+++ b/net/http/transport_security_state_static.certs
@@ -1448,3 +1448,62 @@
 LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7
 jVaMaA==
 -----END CERTIFICATE-----
+
+SymantecClass3EVG3
+-----BEGIN CERTIFICATE-----
+MIIFKzCCBBOgAwIBAgIQfuFKb2/v8tN/P61lTTratDANBgkqhkiG9w0BAQsFADCB
+yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
+ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp
+U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW
+ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5IC0gRzUwHhcNMTMxMDMxMDAwMDAwWhcNMjMxMDMwMjM1OTU5WjB3MQsw
+CQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xHzAdBgNV
+BAsTFlN5bWFudGVjIFRydXN0IE5ldHdvcmsxKDAmBgNVBAMTH1N5bWFudGVjIENs
+YXNzIDMgRVYgU1NMIENBIC0gRzMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
+AoIBAQDYoWV0I+grZOIy1zM3PY71NBZI3U9/hxz4RCMTjvsR2ERaGHGOYBYmkpv9
+FwvhcXBC/r/6HMCqo6e1cej/GIP23xAKE2LIPZyn3i4/DNkd5y77Ks7Imn+Hv9hM
+BBUyydHMlXGgTihPhNk1++OGb5RT5nKKY2cuvmn2926OnGAE6yn6xEdC0niY4+wL
+pZLct5q9gGQrOHw4CVtm9i2VeoayNC6FnpAOX7ddpFFyRnATv2fytqdNFB5suVPu
+IxpOjUhVQ0GxiXVqQCjFfd3SbtICGS97JJRL6/EaqZvjI5rq+jOrCiy39GAI3Z8c
+zd0tAWaAr7MvKR0juIrhoXAHDDQPAgMBAAGjggFdMIIBWTAvBggrBgEFBQcBAQQj
+MCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9zMi5zeW1jYi5jb20wEgYDVR0TAQH/BAgw
+BgEB/wIBADBlBgNVHSAEXjBcMFoGBFUdIAAwUjAmBggrBgEFBQcCARYaaHR0cDov
+L3d3dy5zeW1hdXRoLmNvbS9jcHMwKAYIKwYBBQUHAgIwHBoaaHR0cDovL3d3dy5z
+eW1hdXRoLmNvbS9ycGEwMAYDVR0fBCkwJzAloCOgIYYfaHR0cDovL3MxLnN5bWNi
+LmNvbS9wY2EzLWc1LmNybDAOBgNVHQ8BAf8EBAMCAQYwKQYDVR0RBCIwIKQeMBwx
+GjAYBgNVBAMTEVN5bWFudGVjUEtJLTEtNTMzMB0GA1UdDgQWBBQBWavn3ToLWaZk
+Y9bPIAdX1ZHnajAfBgNVHSMEGDAWgBR/02Wnwt3su/AwCfNDOfoCrzMxMzANBgkq
+hkiG9w0BAQsFAAOCAQEAQgFVe9AWGl1Y6LubqE3X89frE5SG1n8hC0e8V5uSXU8F
+nzikEHzPg74GQ0aNCLxq1xCm+quvL2GoY/Jl339MiBKIT7Np2f8nwAqXkY9W+4nE
+qLuSLRtzsMarNvSWbCAI7woeZiRFT2cAQMgHVHQzO6atuyOfZu2iRHA0+w7qAf3P
+eHTfp61Vt19N9tY/4IbOJMdCqRMURDVLtt/JYKwMf9mTIUvunORJApjTYHtcvNUw
+LwfORELEC5n+5p/8sHiGUW3RLJ3GlvuFgrsEL/digO9i2n/2DqyQuFa9eT/ygG6j
+2bkPXToHHZGThkspTOHcteHgM52zyzaRS/6htO7w+Q==
+-----END CERTIFICATE-----
+
+DigiCertECCSecureServerCA
+-----BEGIN CERTIFICATE-----
+MIIDrDCCApSgAwIBAgIQCssoukZe5TkIdnRw883GEjANBgkqhkiG9w0BAQwFADBh
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
+QTAeFw0xMzAzMDgxMjAwMDBaFw0yMzAzMDgxMjAwMDBaMEwxCzAJBgNVBAYTAlVT
+MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxJjAkBgNVBAMTHURpZ2lDZXJ0IEVDQyBT
+ZWN1cmUgU2VydmVyIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE4ghC6nfYJN6g
+LGSkE85AnCNyqQIKDjc/ITa4jVMU9tWRlUvzlgKNcR7E2Munn17voOZ/WpIRllNv
+68DLP679Wz9HJOeaBy6Wvqgvu1cYr3GkvXg6HuhbPGtkESvMNCuMo4IBITCCAR0w
+EgYDVR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwNAYIKwYBBQUHAQEE
+KDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQgYDVR0f
+BDswOTA3oDWgM4YxaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0R2xv
+YmFsUm9vdENBLmNybDA9BgNVHSAENjA0MDIGBFUdIAAwKjAoBggrBgEFBQcCARYc
+aHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAdBgNVHQ4EFgQUo53mH/naOU/A
+buiRy5Wl2jHiCp8wHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJ
+KoZIhvcNAQEMBQADggEBAMeKoENL7HTJxavVHzA1Nm6YVntIrAVjrnuaVyRXzG/6
+3qttnMe2uuzO58pzZNvfBDcKAEmzP58mrZGMIOgfiA4q+2Y3yDDo0sIkp0VILeoB
+UEoxlBPfjV/aKrtJPGHzecicZpIalir0ezZYoyxBEHQa0+1IttK7igZFcTMQMHp6
+mCHdJLnsnLWSB62DxsRq+HfmNb4TDydkskO/g+l3VtsIh5RHFPVfKK+jaEyDj2D3
+loB5hWp2Jp2VDCADjT7ueihlZGak2YPqmXTNbk19HOuNssWvFhtOyPNV6og4ETQd
+Ea8/B6hPatJ0ES8q/HO3X8IVQwVs1n3aAr0im0/T+Xc=
+-----END CERTIFICATE-----
+
+FacebookBackup
+sha1/1ww8E0AYsR2oX5lndk2hwp2Uosk=
diff --git a/net/http/transport_security_state_static.h b/net/http/transport_security_state_static.h
index 060692d..34c9443 100644
--- a/net/http/transport_security_state_static.h
+++ b/net/http/transport_security_state_static.h
@@ -262,6 +262,7 @@
   DOMAIN_DROPBOX_COM,
   DOMAIN_YOUTUBE_NOCOOKIE_COM,
   DOMAIN_2MDN_NET,
+  DOMAIN_FACEBOOK_COM,
   // Boundary value for UMA_HISTOGRAM_ENUMERATION.
   DOMAIN_NUM_EVENTS,
 };
@@ -517,6 +518,18 @@
     "\x6c\xca\xbd\x7d\xb4\x7e\x94\xa5\x75\x99"
     "\x01\xb6\xa7\xdf\xd4\x5d\x1c\x09\x1c\xcc";
 
+static const char kSPKIHash_SymantecClass3EVG3[] =
+    "\x47\x49\xdf\x16\x57\xf4\x6c\x8b\xd2\x8c"
+    "\x79\x1b\x99\xfb\x9f\x28\x81\x2a\x60\xe0";
+
+static const char kSPKIHash_DigiCertECCSecureServerCA[] =
+    "\xc3\x02\xb1\x73\x62\x0b\x47\x78\x5d\x21"
+    "\xe2\x4d\xb3\xac\x46\xb1\xfc\xb8\xc5\xa9";
+
+static const char kSPKIHash_FacebookBackup[] =
+    "\xd7\x0c\x3c\x13\x40\x18\xb1\x1d\xa8\x5f"
+    "\x99\x67\x76\x4d\xa1\xc2\x9d\x94\xa2\xc9";
+
 // The following is static data describing the hosts that are hardcoded with
 // certificate pins or HSTS information.
 
@@ -648,6 +661,13 @@
   kSPKIHash_ThawtePrimaryRootCA,
   NULL,
 };
+static const char* const kFacebookAcceptableCerts[] = {
+  kSPKIHash_SymantecClass3EVG3,
+  kSPKIHash_DigiCertECCSecureServerCA,
+  kSPKIHash_DigiCertEVRoot,
+  kSPKIHash_FacebookBackup,
+  NULL,
+};
 
 struct Pinset {
   const char *const *const accepted_pins;
@@ -664,6 +684,7 @@
   {kCryptoCatAcceptableCerts, kNoRejectedPublicKeys},
   {kLavabitAcceptableCerts, kNoRejectedPublicKeys},
   {kDropboxAcceptableCerts, kNoRejectedPublicKeys},
+  {kFacebookAcceptableCerts, kNoRejectedPublicKeys},
 };
 
 // kHSTSHuffmanTree describes a Huffman tree. The nodes of the tree are pairs
@@ -672,1413 +693,1498 @@
 // value has the MSB set then it represents a literal leaf value. Otherwise
 // it's a pointer to the n'th element of the array.
 static const uint8 kHSTSHuffmanTree[] = {
-  0xf0, 0xf7, 0x00, 0xec, 0x01, 0x80, 0xe1, 0xe7,
-  0xb3, 0xb1, 0x04, 0xf1, 0xb4, 0x05, 0x06, 0xf8,
-  0xf6, 0x07, 0xeb, 0x08, 0xed, 0x09, 0xe2, 0xe8,
-  0xe3, 0x0b, 0x0a, 0x0c, 0x03, 0x0d, 0x02, 0x0e,
-  0xf3, 0xae, 0xee, 0xf4, 0x10, 0x11, 0xff, 0x12,
-  0xb9, 0xb6, 0x14, 0xb7, 0xb5, 0x15, 0xb0, 0x16,
-  0x17, 0xb2, 0x18, 0xea, 0xfa, 0x19, 0x1a, 0xe6,
-  0xf5, 0x1b, 0xad, 0xf9, 0xe4, 0x1d, 0x1c, 0x1e,
-  0xe5, 0x1f, 0xe9, 0xf2, 0xef, 0x21, 0x20, 0x22,
-  0x13, 0x23, 0x0f, 0x24,
+  0xf2, 0xec, 0x00, 0x80, 0xe7, 0xe1, 0xb3, 0xb1,
+  0x03, 0xf1, 0xb4, 0x04, 0x05, 0xfa, 0xf6, 0x06,
+  0xeb, 0x07, 0xed, 0x08, 0xae, 0xe3, 0x09, 0x0a,
+  0x02, 0x0b, 0x01, 0x0c, 0xe2, 0xe8, 0x0e, 0xf3,
+  0xee, 0xf4, 0x0f, 0x10, 0xff, 0x11, 0xb9, 0xb6,
+  0x13, 0xb7, 0x14, 0xb5, 0x15, 0xb0, 0xb2, 0x16,
+  0x17, 0xea, 0xf8, 0x18, 0x19, 0xe6, 0xf5, 0x1a,
+  0xad, 0xf9, 0xe4, 0x1c, 0x1b, 0x1d, 0xe5, 0x1e,
+  0xf0, 0xf7, 0xe9, 0x20, 0xef, 0x21, 0x1f, 0x22,
+  0x12, 0x23, 0x0d, 0x24,
 };
 
 static const uint8 kPreloadedHSTSData[] = {
-  0xfe, 0xae, 0x0a, 0xf7, 0x29, 0xa2, 0x25, 0x9f,
-  0x0a, 0xf7, 0x29, 0xa2, 0x2d, 0x9b, 0x1f, 0x2a,
-  0x48, 0x54, 0x80, 0x26, 0x94, 0x02, 0xd3, 0xfa,
-  0xf8, 0x20, 0x67, 0xa8, 0x55, 0x4d, 0x34, 0xfc,
-  0xeb, 0x79, 0xb6, 0x34, 0x74, 0x21, 0xf9, 0x72,
-  0x14, 0xab, 0x89, 0x86, 0xb7, 0xc3, 0xb6, 0x7f,
-  0x57, 0x05, 0x7b, 0x94, 0xd1, 0x51, 0x4f, 0xff,
-  0x5b, 0xd6, 0xae, 0xbc, 0xc7, 0xb6, 0x4c, 0xd8,
-  0xe9, 0xf0, 0xaf, 0x72, 0x9a, 0x2b, 0xd9, 0xf7,
-  0xb5, 0x17, 0x47, 0x8e, 0x95, 0x70, 0xf7, 0x04,
-  0xc2, 0x7f, 0xea, 0xf3, 0xab, 0x82, 0xbd, 0xca,
-  0x68, 0x91, 0xa7, 0xff, 0x55, 0x9c, 0xea, 0xe0,
-  0xaf, 0x72, 0x9a, 0x27, 0x89, 0xff, 0xd5, 0x67,
-  0x3a, 0xb8, 0x2b, 0xdc, 0xa6, 0x89, 0xfe, 0x7f,
-  0xf5, 0x59, 0xce, 0xae, 0x0a, 0xf7, 0x29, 0xa2,
-  0x86, 0x9f, 0xfd, 0x56, 0x73, 0xab, 0x82, 0xbd,
-  0xca, 0x68, 0xa2, 0x27, 0xfd, 0xce, 0xae, 0x0a,
-  0xf7, 0x29, 0xa2, 0x91, 0x9f, 0xff, 0xb3, 0x6b,
-  0x26, 0xfa, 0xdf, 0xfc, 0x0a, 0x51, 0x00, 0x54,
-  0xaa, 0xc4, 0x51, 0xb7, 0xa3, 0x4f, 0xfd, 0x5e,
-  0x75, 0x70, 0x57, 0xb9, 0x4d, 0x12, 0x84, 0x3c,
-  0xba, 0x70, 0xe8, 0xd2, 0x14, 0xc7, 0x56, 0x76,
-  0x30, 0xaf, 0x61, 0x35, 0x93, 0x00, 0xa4, 0xdd,
-  0xa9, 0x51, 0x4b, 0x48, 0x7a, 0xea, 0x16, 0x4f,
-  0xfe, 0xab, 0x39, 0xd5, 0xc1, 0x5e, 0xe5, 0x34,
-  0x4e, 0x73, 0xff, 0xaa, 0xce, 0x75, 0x70, 0x57,
-  0xb9, 0x4d, 0x14, 0x4c, 0xff, 0xc2, 0xea, 0xdb,
-  0xd4, 0x69, 0xde, 0x01, 0xd0, 0x28, 0xea, 0xa2,
-  0x96, 0x8a, 0x53, 0xfa, 0xb8, 0x2b, 0xdc, 0xa6,
-  0x88, 0x72, 0x7c, 0x2b, 0xdc, 0xa6, 0x88, 0xbe,
-  0x7d, 0xd7, 0x72, 0x6b, 0x2a, 0x55, 0xc3, 0xd8,
-  0xf9, 0x84, 0xff, 0xea, 0xb3, 0x9d, 0x5c, 0x15,
-  0xee, 0x53, 0x44, 0xc9, 0x3f, 0xab, 0x82, 0xbd,
-  0xca, 0x68, 0xb7, 0xa7, 0xff, 0x55, 0x9c, 0xea,
-  0xe0, 0xaf, 0x72, 0x9a, 0x29, 0x38, 0x44, 0xe6,
-  0x5d, 0x09, 0x3c, 0x27, 0xa2, 0x93, 0x63, 0xb9,
-  0xfd, 0x5c, 0x15, 0xee, 0x53, 0x44, 0x3b, 0x3f,
-  0xfa, 0xac, 0xe7, 0x57, 0x05, 0x7b, 0x94, 0xd1,
-  0x2c, 0x4f, 0xea, 0xe0, 0xaf, 0x72, 0x9a, 0x23,
-  0x09, 0xff, 0xab, 0xce, 0xae, 0x0a, 0xf7, 0x29,
-  0xa2, 0x3d, 0x9f, 0xd5, 0xc1, 0x5e, 0xe5, 0x34,
-  0x58, 0x73, 0xfa, 0xb8, 0x2b, 0xdc, 0xa6, 0x8b,
-  0x9e, 0x11, 0x38, 0xa7, 0x8e, 0xdc, 0xa5, 0xe3,
-  0xb6, 0x26, 0x5c, 0xee, 0x7f, 0x57, 0x05, 0x7b,
-  0x94, 0xd1, 0x0f, 0x4f, 0x85, 0x7b, 0x94, 0xd1,
-  0x13, 0x4d, 0x76, 0x1d, 0x3f, 0xfb, 0x2d, 0xbd,
-  0xea, 0x27, 0x9f, 0xba, 0x30, 0xe8, 0x7c, 0xf8,
-  0xec, 0x2d, 0x3d, 0x7d, 0x3b, 0x79, 0xa2, 0x17,
-  0x95, 0x71, 0x1c, 0xf4, 0x84, 0x9e, 0x84, 0x73,
-  0xd7, 0xb7, 0xae, 0x74, 0xff, 0xef, 0x34, 0xec,
-  0x7d, 0xdb, 0x99, 0xdd, 0xf3, 0xa6, 0xed, 0x43,
-  0xa5, 0xaa, 0xe2, 0x21, 0xec, 0x45, 0xc9, 0xb3,
-  0xeb, 0x75, 0xf9, 0xc7, 0x4f, 0x7a, 0x9e, 0x01,
-  0xd3, 0x82, 0x10, 0x95, 0x3e, 0xef, 0xde, 0xd8,
-  0x55, 0x4b, 0xc9, 0xf7, 0x5d, 0xac, 0xb9, 0xd1,
-  0xb2, 0x26, 0x80, 0x7d, 0xf3, 0x59, 0xff, 0x81,
-  0xe6, 0xb7, 0x59, 0x3c, 0x3a, 0x6a, 0xce, 0x9f,
-  0xf7, 0xb5, 0xa7, 0xd2, 0x89, 0xe6, 0x1d, 0x3f,
-  0x63, 0x6d, 0x1d, 0x94, 0x3a, 0x7b, 0x36, 0xc7,
-  0x8e, 0x8c, 0x4f, 0x37, 0xd0, 0xc0, 0x68, 0xc6,
-  0xc9, 0x9f, 0x3f, 0xb9, 0x7c, 0xfd, 0x81, 0x4c,
-  0xdb, 0xc7, 0x4f, 0xff, 0xfe, 0xff, 0xdf, 0x4d,
-  0x7f, 0xcd, 0xad, 0xe6, 0xb7, 0x53, 0x1f, 0x70,
-  0xe0, 0x4e, 0x9f, 0x7a, 0xfa, 0x23, 0xc7, 0x4f,
-  0xe7, 0xdd, 0x4d, 0x7a, 0x23, 0xe7, 0x4f, 0xee,
-  0x0e, 0x8d, 0x25, 0xf8, 0xe8, 0xf1, 0xf5, 0xfc,
-  0xe2, 0x11, 0x33, 0x5c, 0x7f, 0x18, 0x4a, 0x4d,
-  0xa3, 0x8e, 0x9d, 0xd7, 0xa1, 0xd3, 0x68, 0xf1,
-  0xd3, 0xc9, 0xfb, 0xb4, 0xe3, 0x66, 0x23, 0x73,
-  0xff, 0xed, 0x12, 0xfb, 0xbf, 0xa6, 0xa6, 0xec,
-  0xbb, 0x7e, 0x5c, 0xe9, 0xff, 0xac, 0x9a, 0xf7,
-  0x5f, 0xfd, 0x74, 0xb9, 0xd3, 0xfb, 0x73, 0xee,
-  0xf5, 0xb4, 0x61, 0xd0, 0x03, 0xff, 0xfa, 0x3c,
-  0xff, 0x85, 0xad, 0xd4, 0x4f, 0x3d, 0xd7, 0x3a,
-  0x10, 0xf8, 0xf4, 0x22, 0x9f, 0xff, 0xfe, 0xd3,
-  0xf4, 0x1f, 0xa3, 0x5b, 0xb7, 0xdf, 0xce, 0xc7,
-  0xef, 0x8d, 0xbf, 0x94, 0x3a, 0x48, 0x74, 0xfe,
-  0x77, 0x0f, 0xa8, 0x8f, 0x9d, 0x3f, 0xff, 0xff,
-  0xbc, 0x0a, 0x7f, 0x39, 0xfd, 0xdb, 0x5b, 0x4d,
-  0xdf, 0xc7, 0xdd, 0x9a, 0x3d, 0xfc, 0xe7, 0xce,
-  0x9d, 0xdc, 0xa6, 0x8a, 0x62, 0x31, 0x17, 0xeb,
-  0x09, 0x99, 0xff, 0x67, 0xdf, 0x75, 0x2e, 0x82,
-  0xd1, 0xd3, 0xe7, 0xff, 0x8d, 0xb0, 0xe8, 0xf1,
-  0xf4, 0x71, 0xfc, 0xff, 0x73, 0x36, 0xb2, 0x3d,
-  0x81, 0x3a, 0x7f, 0xff, 0x7f, 0x16, 0xf7, 0x4b,
-  0xd1, 0xaf, 0xe0, 0x77, 0x23, 0x75, 0x3a, 0x7f,
-  0xca, 0x8c, 0xb6, 0x53, 0x3d, 0xf3, 0xa1, 0x11,
-  0x49, 0x66, 0x89, 0xf0, 0xa3, 0x64, 0x13, 0xa7,
-  0xee, 0xfe, 0xed, 0x93, 0xe7, 0x46, 0x1f, 0xbf,
-  0x88, 0xb4, 0x26, 0x87, 0x97, 0x67, 0xf6, 0x4a,
-  0xd6, 0x70, 0xb1, 0xa1, 0xbe, 0x45, 0xe8, 0x43,
-  0x34, 0x1e, 0x30, 0xf1, 0x64, 0x23, 0xbe, 0x43,
-  0x78, 0xd5, 0x27, 0xfd, 0xac, 0x78, 0x3b, 0xbb,
-  0x6e, 0x78, 0xe9, 0xec, 0xfe, 0xbd, 0x59, 0xd3,
-  0xff, 0xff, 0xeb, 0x7a, 0xf6, 0xc1, 0x46, 0xdb,
-  0x99, 0xa6, 0xa6, 0xec, 0x7d, 0xd9, 0xa7, 0xc1,
-  0x43, 0xa5, 0x7f, 0x22, 0xda, 0x84, 0xf3, 0xff,
-  0xec, 0xcb, 0x79, 0x6d, 0x9b, 0xa9, 0xa5, 0x93,
-  0x56, 0x74, 0xff, 0xd4, 0xe7, 0xf7, 0x31, 0x33,
-  0xf7, 0x6f, 0x3a, 0x5e, 0xfa, 0x28, 0xee, 0xb5,
-  0x3e, 0x72, 0x3e, 0xea, 0x1d, 0x3f, 0xff, 0xff,
-  0xec, 0xfe, 0xbd, 0xde, 0xb6, 0x95, 0x6b, 0xd7,
-  0x46, 0x7f, 0xb5, 0xdb, 0xd5, 0xcb, 0x3e, 0x04,
-  0xd8, 0xa9, 0xff, 0xff, 0x97, 0xc1, 0xdb, 0x41,
-  0xdd, 0xa2, 0x3d, 0x45, 0xb6, 0x96, 0x7f, 0x82,
-  0x74, 0xda, 0x3c, 0xfa, 0x68, 0xde, 0x28, 0xa4,
-  0x29, 0x61, 0x15, 0x40, 0x5a, 0x19, 0x9f, 0x8d,
-  0xbe, 0x7f, 0xf3, 0x17, 0x75, 0xb9, 0xd8, 0xce,
-  0xf8, 0x0e, 0x9f, 0xff, 0x7b, 0xf7, 0xb6, 0x6a,
-  0x5d, 0xac, 0xd5, 0xf7, 0xc0, 0x74, 0xff, 0xc9,
-  0xf7, 0xbf, 0x8d, 0xa9, 0xa2, 0x3e, 0x74, 0x51,
-  0x14, 0xba, 0x2e, 0xcf, 0x65, 0xf1, 0xbb, 0x3a,
-  0x73, 0x7e, 0x58, 0xe9, 0xb3, 0x63, 0xa1, 0xe4,
-  0xdb, 0x1d, 0x0e, 0xfa, 0x12, 0x5c, 0x95, 0xb0,
-  0xf4, 0xfd, 0xb2, 0x7e, 0xdc, 0xe3, 0xa7, 0x26,
-  0xc8, 0x74, 0xfe, 0x69, 0xd9, 0x7a, 0x73, 0x5b,
-  0x8f, 0x21, 0x85, 0xb3, 0xf6, 0xa5, 0xbb, 0x56,
-  0x80, 0x3a, 0x7f, 0x0b, 0x5f, 0xcb, 0x75, 0xce,
-  0x8c, 0x3e, 0x5f, 0x19, 0xcf, 0xc8, 0x0c, 0xbe,
-  0xf7, 0x8e, 0x87, 0x1e, 0x87, 0xc8, 0x67, 0xff,
-  0xfd, 0x7f, 0xf0, 0x28, 0xf6, 0x7b, 0xf7, 0xfe,
-  0x36, 0xdd, 0x40, 0xfc, 0xe9, 0xff, 0x7b, 0x1a,
-  0xdd, 0x44, 0xb7, 0x6a, 0xce, 0x9f, 0xdc, 0xfd,
-  0x2d, 0x9c, 0x27, 0x46, 0xc7, 0xeb, 0x74, 0x49,
-  0x30, 0xe9, 0xdf, 0xcd, 0x8e, 0x84, 0x35, 0x8f,
-  0x88, 0x4f, 0xcf, 0xd3, 0x33, 0xfa, 0xce, 0x9e,
-  0x66, 0xf4, 0x01, 0xd1, 0x87, 0xa5, 0xe2, 0xf8,
-  0x44, 0xf2, 0xb2, 0x1c, 0xfe, 0x4f, 0x17, 0x39,
-  0xfd, 0x7f, 0x3d, 0x96, 0xd2, 0xe7, 0x4f, 0x63,
-  0xe8, 0xd1, 0xd3, 0xf5, 0xb9, 0xcc, 0x1f, 0x1d,
-  0x3e, 0xf0, 0x07, 0x1f, 0x3a, 0x35, 0xa2, 0xab,
-  0xc6, 0xa0, 0x22, 0xd0, 0xb2, 0x7f, 0xfe, 0x17,
-  0x5b, 0x1a, 0xb2, 0x7f, 0x5f, 0xf2, 0xf6, 0xd0,
-  0xe9, 0xff, 0xfd, 0xec, 0x7d, 0xd4, 0xbd, 0x91,
-  0x89, 0xed, 0xb7, 0x23, 0x75, 0x3a, 0x7f, 0xff,
-  0xfd, 0xa7, 0xf7, 0x07, 0x9f, 0x70, 0xf0, 0x37,
-  0x53, 0x44, 0x7e, 0xd9, 0xef, 0xe6, 0xb3, 0xa7,
-  0xff, 0xda, 0x08, 0xe5, 0xe9, 0x6f, 0x66, 0xeb,
-  0x01, 0x0e, 0x8c, 0x47, 0x15, 0xa1, 0x19, 0x3f,
-  0xfc, 0xed, 0x4b, 0x62, 0x7d, 0xaf, 0xe5, 0xe9,
-  0xc7, 0x4f, 0xff, 0xb6, 0xc6, 0x6e, 0xd4, 0xba,
-  0x51, 0xa7, 0x70, 0xbc, 0x74, 0xff, 0x67, 0xde,
-  0xdc, 0x0e, 0xe6, 0x8e, 0x9f, 0xf5, 0x34, 0xfe,
-  0xea, 0x68, 0xdf, 0xa0, 0x9d, 0x3f, 0xf9, 0xed,
-  0xd4, 0xb6, 0x9b, 0xaf, 0x4a, 0x20, 0x9d, 0x3f,
-  0xff, 0xec, 0x7e, 0x9e, 0xc0, 0xee, 0xb6, 0x5e,
-  0x98, 0xf6, 0xec, 0xf6, 0xc7, 0x46, 0x23, 0x0b,
-  0xca, 0x10, 0xf2, 0xb8, 0x75, 0x8d, 0x31, 0xf2,
-  0x7f, 0x29, 0x31, 0x72, 0x87, 0x77, 0x8c, 0x26,
-  0x7f, 0xdc, 0x36, 0xcb, 0xa7, 0xfc, 0x03, 0xa7,
-  0xfb, 0x02, 0xfb, 0xa9, 0xba, 0xfe, 0x3a, 0x7f,
-  0xff, 0xc8, 0xa8, 0xcd, 0xcd, 0x5b, 0xdf, 0xdb,
-  0x76, 0xf5, 0xfe, 0x5b, 0x0e, 0x85, 0x47, 0x57,
-  0xcf, 0x35, 0x0f, 0x27, 0xbd, 0x7f, 0x21, 0xd3,
-  0xff, 0xff, 0xf5, 0xd1, 0x9f, 0xf6, 0xbb, 0x73,
-  0x5b, 0xbf, 0xa6, 0xa6, 0xec, 0x7d, 0xd9, 0xa7,
-  0xc1, 0x43, 0xa1, 0xc8, 0xb8, 0xf1, 0x0c, 0x22,
-  0xf2, 0x7e, 0x4b, 0xe5, 0xf4, 0x6b, 0xbd, 0x0e,
-  0xa9, 0xeb, 0xd3, 0x80, 0x74, 0xff, 0xd6, 0xf6,
-  0xef, 0x0e, 0x8f, 0x70, 0xa9, 0xd3, 0xf5, 0xf8,
-  0x7e, 0xff, 0x8e, 0x8c, 0x44, 0xa6, 0xb2, 0x1b,
-  0xa3, 0x4f, 0x6f, 0xd3, 0xa8, 0x74, 0xff, 0xfd,
-  0xe1, 0xdd, 0x9e, 0xcf, 0xeb, 0xb7, 0xb1, 0x98,
-  0xa7, 0x4f, 0xff, 0xf7, 0x9e, 0x14, 0x65, 0x34,
-  0x4d, 0xc8, 0x29, 0xb5, 0x91, 0x87, 0x46, 0x23,
-  0x10, 0x57, 0x27, 0xff, 0xff, 0x08, 0xf9, 0xed,
-  0xd6, 0xcb, 0xfd, 0x1a, 0xb6, 0x3c, 0x8f, 0xdf,
-  0x45, 0x3a, 0x7f, 0xff, 0xe4, 0xd7, 0x64, 0xdd,
-  0xfc, 0xd3, 0x5e, 0xe7, 0xdd, 0x4f, 0x7f, 0x7a,
-  0x3c, 0x74, 0xf9, 0xfa, 0x7b, 0x3e, 0x74, 0x62,
-  0x29, 0xf4, 0x7f, 0x8f, 0x26, 0x8d, 0x68, 0xc8,
-  0xe7, 0xfb, 0xfa, 0x35, 0xfc, 0xb7, 0x5c, 0xe9,
-  0xfe, 0xda, 0xc8, 0x1d, 0xad, 0xcc, 0x3a, 0x7f,
-  0xff, 0xb8, 0x6d, 0x97, 0xf6, 0x7d, 0xea, 0x26,
-  0x7f, 0x6b, 0x21, 0xd3, 0xd7, 0xdc, 0xf0, 0x9d,
-  0x0f, 0xa2, 0x27, 0x99, 0x67, 0xe6, 0x9f, 0x76,
-  0x89, 0x73, 0xa7, 0xfa, 0xdc, 0xcf, 0xe5, 0xba,
-  0xe7, 0x42, 0x1f, 0x3d, 0x0c, 0x27, 0xec, 0xb8,
-  0x8e, 0x38, 0xe9, 0xfb, 0xf9, 0x6f, 0xe2, 0x9d,
-  0x3d, 0xfc, 0xa6, 0xe6, 0x8f, 0x56, 0xe5, 0x51,
-  0xb2, 0xbc, 0xa5, 0x8d, 0x9f, 0xc5, 0x42, 0x75,
-  0x68, 0x61, 0xde, 0x11, 0x4d, 0x9d, 0xa7, 0xfe,
-  0xff, 0xf3, 0x70, 0xe5, 0xbf, 0x8d, 0x1d, 0x08,
-  0xba, 0xdd, 0x93, 0x96, 0x5c, 0xef, 0x3e, 0xfa,
-  0x33, 0xb6, 0x3a, 0x7f, 0x63, 0x56, 0xcb, 0xa6,
-  0xc7, 0x4f, 0xff, 0xff, 0x5b, 0x2f, 0x4e, 0x6b,
-  0x77, 0xf1, 0xf7, 0x66, 0x8f, 0x7f, 0x36, 0xb7,
-  0x9a, 0x3a, 0x6d, 0x35, 0x9d, 0x02, 0x89, 0xeb,
-  0xc2, 0x16, 0x7e, 0xc7, 0xbf, 0x8f, 0xd0, 0xe9,
-  0xff, 0xc2, 0xfb, 0xa9, 0x8c, 0x7d, 0x2d, 0x64,
-  0x3a, 0x54, 0x3a, 0x34, 0x3d, 0xad, 0xe9, 0x53,
-  0xf9, 0x19, 0xfc, 0xb7, 0x5c, 0xe9, 0xff, 0xff,
-  0x5f, 0xe8, 0x07, 0xdd, 0x4d, 0x12, 0xff, 0xcd,
-  0xbd, 0x82, 0xd1, 0xd1, 0xe5, 0x4d, 0x8d, 0x13,
-  0xf4, 0x34, 0x7e, 0x4f, 0x48, 0x44, 0x68, 0x4b,
-  0xbc, 0xc6, 0x7c, 0xef, 0x0e, 0x3e, 0x74, 0xfb,
-  0x28, 0xf6, 0x04, 0xe8, 0x7c, 0xf3, 0xac, 0x4f,
-  0x3f, 0xfe, 0xf3, 0xd8, 0xbb, 0x5b, 0xd9, 0xaf,
-  0x76, 0xbd, 0x10, 0xe9, 0xed, 0x4b, 0xe5, 0x8e,
-  0x9f, 0xff, 0xfb, 0x51, 0xf7, 0x73, 0xfb, 0xbf,
-  0xa6, 0xa6, 0xec, 0x7d, 0xd9, 0xa7, 0xc1, 0x43,
-  0xa1, 0xe4, 0x53, 0x61, 0x24, 0xff, 0xff, 0xf9,
-  0x1f, 0xa6, 0x88, 0xfe, 0xeb, 0x66, 0xdb, 0xbf,
-  0x9a, 0x6b, 0xdd, 0x40, 0x03, 0xd7, 0x3a, 0x7c,
-  0x9f, 0x7f, 0x9e, 0x3a, 0x7f, 0xff, 0xff, 0xf6,
-  0x33, 0x15, 0x2c, 0x8c, 0xbe, 0x52, 0x88, 0x22,
-  0x9f, 0xc7, 0xb3, 0x4a, 0x68, 0xd7, 0xd1, 0x87,
-  0x4f, 0xf0, 0x33, 0x6f, 0xe5, 0xba, 0xe7, 0x4f,
-  0xfc, 0xfa, 0x6b, 0xd4, 0xd3, 0x3e, 0xd6, 0xf6,
-  0x1d, 0x3f, 0xfd, 0x97, 0xdb, 0x30, 0x14, 0xdc,
-  0x34, 0xda, 0x87, 0x42, 0x2b, 0x7d, 0xc2, 0x3f,
-  0x46, 0x06, 0x24, 0x6c, 0x84, 0x8d, 0x8a, 0x3a,
-  0x14, 0x7f, 0x38, 0xa2, 0x74, 0xed, 0xb7, 0x34,
-  0x74, 0xff, 0xf3, 0xee, 0xfa, 0x6e, 0x67, 0xd3,
-  0x5d, 0xfc, 0xf1, 0xd1, 0x87, 0xed, 0xe2, 0x09,
-  0xf9, 0xe6, 0x9c, 0xdc, 0x17, 0x8e, 0x9f, 0x33,
-  0xdb, 0x66, 0xc7, 0x49, 0xa3, 0xa6, 0x46, 0x1d,
-  0x2b, 0x9d, 0x02, 0x69, 0x78, 0x56, 0x36, 0x3d,
-  0x5b, 0x1b, 0x4f, 0x5e, 0x9c, 0xf9, 0xd3, 0x35,
-  0xc7, 0x4f, 0xeb, 0x78, 0x5f, 0x77, 0xd0, 0xe8,
-  0xd5, 0x09, 0xa0, 0x21, 0xa6, 0x3f, 0x78, 0x8d,
-  0x84, 0x5a, 0x0b, 0x4f, 0xea, 0x79, 0xf0, 0xf7,
-  0xc0, 0x74, 0xff, 0xf9, 0x05, 0x17, 0x18, 0x8a,
-  0xef, 0x53, 0x46, 0x1d, 0x0d, 0x22, 0x19, 0xbc,
-  0xd2, 0x77, 0xc0, 0x87, 0x4a, 0xad, 0xc7, 0x56,
-  0xbe, 0x92, 0x81, 0x9e, 0x5d, 0xda, 0x36, 0x1c,
-  0x9d, 0xd2, 0xd7, 0x0b, 0xa5, 0x96, 0xf0, 0xfc,
-  0x75, 0x1e, 0x84, 0xdb, 0x51, 0x81, 0x8c, 0x7d,
-  0x8c, 0x87, 0x55, 0xa7, 0xa3, 0xfa, 0x1c, 0x7f,
-  0x9d, 0x9f, 0xa4, 0xaa, 0x4b, 0xce, 0x1f, 0x36,
-  0x8c, 0x09, 0xbe, 0x36, 0x1d, 0xf0, 0xe3, 0xd4,
-  0x27, 0x9f, 0xd5, 0xc1, 0x5e, 0xe5, 0x34, 0x53,
-  0xb3, 0xe1, 0x5e, 0xe5, 0x34, 0x54, 0x73, 0xfe,
-  0xe7, 0x57, 0x05, 0x7b, 0x94, 0xd1, 0x34, 0x4a,
-  0xb8, 0x7e, 0xcc, 0x30, 0x9f, 0xd5, 0xc1, 0x5e,
-  0xe5, 0x34, 0x55, 0xf3, 0xe1, 0x5e, 0xe5, 0x34,
-  0x56, 0xd3, 0xfc, 0xea, 0xe0, 0xaf, 0x72, 0x9a,
-  0x24, 0x19, 0x57, 0x0f, 0xc7, 0x8c, 0x27, 0xfe,
-  0xaf, 0x3a, 0xb8, 0x2b, 0xdc, 0xa6, 0x89, 0x0e,
-  0x7c, 0x2b, 0xdc, 0xa6, 0x8b, 0x12, 0x7f, 0xe4,
-  0xca, 0x67, 0xf6, 0xf0, 0x13, 0xe7, 0x4e, 0xfa,
-  0x3c, 0x74, 0x9d, 0xf3, 0xdf, 0xd1, 0x0e, 0x73,
-  0x7f, 0x80, 0x74, 0xe1, 0x47, 0x1d, 0x3e, 0xe7,
-  0x6f, 0xb2, 0x1d, 0x3f, 0x52, 0x83, 0xe0, 0xea,
-  0xce, 0x8f, 0x1e, 0xcf, 0x14, 0x4f, 0xe0, 0x26,
-  0x5f, 0xdf, 0x09, 0x51, 0x89, 0xce, 0xbf, 0x08,
-  0xff, 0x14, 0x88, 0xfd, 0x9c, 0xc0, 0x43, 0x3f,
-  0xf5, 0xbc, 0x97, 0xb7, 0x6b, 0xcf, 0x80, 0xe9,
-  0xff, 0xfd, 0x7b, 0xf3, 0xa9, 0x9f, 0x46, 0x76,
-  0x5e, 0xe8, 0xc3, 0xa7, 0xff, 0xb1, 0xf7, 0x5f,
-  0x47, 0xab, 0x6e, 0x67, 0xa8, 0x74, 0xd6, 0xae,
-  0x23, 0xdb, 0xc8, 0xbf, 0x5e, 0x8a, 0xa7, 0x1a,
-  0x91, 0xa9, 0x4f, 0xea, 0xe0, 0xaf, 0x72, 0x9a,
-  0x2c, 0xd9, 0xff, 0xd5, 0x67, 0x3a, 0xb8, 0x2b,
-  0xdc, 0xa6, 0x8a, 0x02, 0x6d, 0xd4, 0x3a, 0x79,
-  0x7b, 0x94, 0xd1, 0x6f, 0xcf, 0xdb, 0xef, 0xcb,
-  0xc2, 0x74, 0x09, 0xeb, 0x80, 0xae, 0x7d, 0x77,
-  0x53, 0x7d, 0x0e, 0x9f, 0xc8, 0xdb, 0x7d, 0xfe,
-  0x80, 0x3a, 0x7f, 0x68, 0xfd, 0x11, 0x71, 0x87,
-  0x4e, 0xfe, 0x38, 0xe9, 0x55, 0xc9, 0x9f, 0x63,
-  0x78, 0x90, 0xd8, 0xab, 0xe6, 0xd7, 0x33, 0x9f,
-  0xf7, 0x3a, 0xb8, 0x2b, 0xdc, 0xa6, 0x8a, 0x52,
-  0x7f, 0x9d, 0x5c, 0x15, 0xee, 0x53, 0x44, 0x9d,
-  0x2a, 0xb1, 0x10, 0xfc, 0x8d, 0x08, 0xed, 0xc2,
-  0x5e, 0x8c, 0x8b, 0x6b, 0x58, 0x43, 0x91, 0xd3,
-  0xac, 0x2c, 0x7c, 0x4f, 0xab, 0x85, 0x63, 0x44,
-  0xcc, 0x96, 0xed, 0x62, 0x90, 0x1d, 0xd2, 0x39,
-  0x06, 0xd0, 0xe3, 0x9f, 0x0a, 0xf7, 0x29, 0xa2,
-  0x1f, 0x9f, 0xf7, 0x3a, 0xb8, 0x2b, 0xdc, 0xa6,
-  0x89, 0x4e, 0x55, 0xc3, 0xf6, 0x61, 0x84, 0xfe,
-  0xae, 0x0a, 0xf7, 0x29, 0xa2, 0x27, 0x9f, 0xd5,
-  0xc1, 0x5e, 0xe5, 0x34, 0x46, 0x33, 0xff, 0xaa,
-  0xce, 0x75, 0x70, 0x57, 0xb9, 0x4d, 0x13, 0xcc,
-  0x22, 0x3b, 0xde, 0x27, 0x71, 0xdd, 0x8e, 0xe7,
-  0xc2, 0xbd, 0xca, 0x68, 0x88, 0x27, 0xfd, 0xce,
-  0xae, 0x0a, 0xf7, 0x29, 0xa2, 0x54, 0x95, 0x70,
-  0xfd, 0x98, 0x61, 0x3f, 0xab, 0x82, 0xbd, 0xca,
-  0x68, 0x8a, 0x27, 0xf5, 0x70, 0x57, 0xb9, 0x4d,
-  0x11, 0x94, 0xff, 0xea, 0xb3, 0x9d, 0x5c, 0x15,
-  0xee, 0x53, 0x44, 0xcb, 0x3f, 0xab, 0x82, 0xbd,
-  0xca, 0x68, 0xa9, 0x27, 0xf5, 0x70, 0x57, 0xb9,
-  0x4d, 0x15, 0xd4, 0xfe, 0xae, 0x0a, 0xf7, 0x29,
-  0xa2, 0xc5, 0x9f, 0xf9, 0x9c, 0xea, 0xe0, 0xaf,
-  0x72, 0x9a, 0x27, 0xa9, 0xfe, 0x0d, 0x79, 0x3c,
-  0xdf, 0xed, 0x43, 0xa2, 0xa8, 0x8a, 0x44, 0xc9,
-  0xfb, 0x54, 0xf9, 0x7f, 0x69, 0x43, 0xa7, 0x85,
-  0x97, 0x7c, 0xe9, 0xcb, 0x96, 0x2a, 0x7f, 0xfe,
-  0xb7, 0xfb, 0x5f, 0x85, 0x1c, 0xec, 0xa0, 0x00,
-  0x87, 0x4f, 0xff, 0xc3, 0xed, 0x4e, 0x65, 0x50,
-  0x47, 0xda, 0x8b, 0xa3, 0xc7, 0x4f, 0x97, 0xd6,
-  0xde, 0xc3, 0xa7, 0xff, 0x75, 0x3f, 0x80, 0xad,
-  0xbc, 0xbc, 0x27, 0x4f, 0xaf, 0x64, 0x62, 0x9d,
-  0x3f, 0xfb, 0xfb, 0x91, 0x3e, 0x8c, 0xdd, 0xba,
-  0xcd, 0xe7, 0x4f, 0xf6, 0x9d, 0x4e, 0xb6, 0x9f,
-  0x78, 0xe8, 0xf2, 0x7b, 0xc2, 0xb6, 0xc6, 0x0b,
-  0x14, 0xfd, 0x1e, 0xe4, 0xda, 0x8a, 0x53, 0xbf,
-  0xd7, 0x35, 0x42, 0xd3, 0xbf, 0xea, 0x1d, 0x20,
-  0xea, 0xa7, 0x88, 0x85, 0x13, 0xc2, 0xdb, 0x98,
-  0x74, 0x61, 0xe7, 0x78, 0xb2, 0x7f, 0xde, 0xb7,
-  0x5d, 0x1a, 0xa7, 0x98, 0x74, 0xfd, 0xef, 0xeb,
-  0xf6, 0x50, 0xe9, 0xef, 0xed, 0xbb, 0x59, 0xd3,
-  0xf6, 0x50, 0x3d, 0xf7, 0x8e, 0x8e, 0x3d, 0x4f,
-  0x93, 0xcf, 0xb4, 0xd7, 0x4d, 0x90, 0xe8, 0xc4,
-  0x67, 0xfa, 0x10, 0x76, 0x21, 0x9f, 0xff, 0xfd,
-  0x64, 0xf0, 0x8a, 0x6f, 0xbf, 0xbf, 0xa3, 0xb2,
-  0x9b, 0x69, 0xc2, 0xe3, 0xa7, 0xcf, 0x6c, 0x3e,
-  0x09, 0xd3, 0xf6, 0xdc, 0x20, 0x6f, 0xc3, 0xa7,
-  0xfd, 0xff, 0x3a, 0xf6, 0xc1, 0xf5, 0x0e, 0x9f,
-  0xf7, 0x60, 0x13, 0xfd, 0xb6, 0x6b, 0x3a, 0x1c,
-  0x7f, 0x80, 0x3e, 0x9e, 0xd2, 0x96, 0x61, 0xd3,
-  0xf6, 0x94, 0xbd, 0x32, 0xe7, 0x4e, 0x08, 0x42,
-  0x54, 0xff, 0xeb, 0xfa, 0xf4, 0xb7, 0x9b, 0xf7,
-  0x8a, 0x38, 0xaa, 0x97, 0x91, 0xe4, 0x54, 0x68,
-  0x95, 0x0e, 0x54, 0xbf, 0x8f, 0x5e, 0x29, 0x18,
-  0x55, 0xfc, 0x8a, 0xf0, 0xcb, 0x9b, 0x5e, 0x1d,
-  0x3e, 0x0d, 0xd1, 0xf0, 0x9d, 0x3f, 0x93, 0x86,
-  0xc1, 0xed, 0x8a, 0x98, 0x21, 0x2a, 0x36, 0x3c,
-  0x70, 0x98, 0xcf, 0x52, 0xfe, 0xd5, 0x95, 0x53,
-  0x47, 0x3f, 0xfb, 0x4a, 0x53, 0x6f, 0xa6, 0xd6,
-  0x4b, 0xd0, 0xe9, 0xff, 0x5f, 0xc3, 0xc0, 0xd4,
-  0xbe, 0x58, 0xe8, 0x72, 0x23, 0x7c, 0x9b, 0x3e,
-  0xc7, 0xb3, 0xc2, 0x74, 0xfd, 0x74, 0x1d, 0xb3,
-  0xe7, 0x4f, 0xed, 0xac, 0x9f, 0x0f, 0x3e, 0x74,
-  0xff, 0xff, 0xbc, 0xce, 0xfb, 0xee, 0xa8, 0x73,
-  0xcd, 0xb3, 0xf9, 0xb7, 0x38, 0xf1, 0x7a, 0xc2,
-  0x23, 0x73, 0x8b, 0x34, 0x34, 0x9f, 0xfe, 0xcb,
-  0xd3, 0x1a, 0xb2, 0x36, 0xcb, 0x59, 0x0e, 0x9f,
-  0xff, 0xff, 0x7b, 0x1f, 0xa7, 0xb0, 0x3b, 0xb1,
-  0xf7, 0x53, 0xd7, 0xa7, 0x9f, 0xdb, 0x6d, 0x1e,
-  0x3a, 0x3e, 0x8d, 0xeb, 0xa8, 0x4d, 0xe0, 0x9d,
-  0x36, 0xf0, 0x1d, 0x0d, 0x1a, 0xe0, 0x0b, 0x4e,
-  0x77, 0x6c, 0x74, 0xc1, 0x09, 0xd1, 0xe3, 0xd4,
-  0xa1, 0x10, 0x47, 0x27, 0x5f, 0x78, 0x0a, 0xa9,
-  0xaf, 0x9f, 0xff, 0xfd, 0x74, 0xda, 0xda, 0x76,
-  0xb6, 0x76, 0xd9, 0x9f, 0xd7, 0x4a, 0x67, 0xc0,
-  0x74, 0x3e, 0x8a, 0xbf, 0x17, 0x4f, 0xf6, 0x5e,
-  0xc8, 0x37, 0xc5, 0x3a, 0x72, 0x0b, 0x47, 0x46,
-  0x27, 0xe7, 0xd1, 0xbf, 0xfc, 0x91, 0xbc, 0xd6,
-  0x7d, 0xfc, 0xbf, 0x6a, 0x1d, 0x3f, 0xf6, 0x08,
-  0xe3, 0x56, 0xca, 0x77, 0xce, 0x9f, 0xdf, 0x41,
-  0xd1, 0x6c, 0x87, 0x4f, 0xbd, 0xae, 0xdc, 0xe3,
-  0xa7, 0xef, 0x23, 0x1e, 0xc0, 0x9d, 0x30, 0x42,
-  0x74, 0x29, 0xf6, 0x09, 0x48, 0x4b, 0x67, 0xfb,
-  0x1a, 0xe6, 0xb9, 0xf7, 0x50, 0xaa, 0x9a, 0xd9,
-  0xff, 0xd9, 0xf0, 0x65, 0xbc, 0xfd, 0x2d, 0xa5,
-  0x0e, 0x9f, 0xbf, 0xc0, 0xdb, 0x3e, 0x74, 0xfc,
-  0xcf, 0x37, 0xe0, 0xeb, 0x3a, 0x70, 0x42, 0x12,
-  0xa7, 0xfe, 0x41, 0xfe, 0x9d, 0xbf, 0x1a, 0x46,
-  0x1d, 0x52, 0xf2, 0x35, 0x6a, 0x8b, 0x9a, 0x86,
-  0x55, 0x12, 0xae, 0x99, 0xa1, 0x68, 0x53, 0x67,
-  0x70, 0xbc, 0x79, 0x04, 0xa7, 0x9d, 0x8f, 0xb8,
-  0xf2, 0x09, 0x4e, 0xa7, 0xb6, 0x3c, 0x82, 0x53,
-  0x04, 0x27, 0x90, 0x4a, 0x15, 0x14, 0x8d, 0x14,
-  0x5c, 0xbc, 0x25, 0x53, 0x75, 0xcb, 0x20, 0x95,
-  0x4d, 0xec, 0xfd, 0x96, 0xcc, 0xfe, 0xb3, 0xa7,
-  0x77, 0xc1, 0xf3, 0xdf, 0xb9, 0x94, 0xf3, 0x7e,
-  0x75, 0x8e, 0x96, 0x6a, 0xcf, 0x58, 0x06, 0x73,
-  0xf9, 0xa7, 0x68, 0xf5, 0xfc, 0xf1, 0x53, 0xfb,
-  0xce, 0xd3, 0xa9, 0x6f, 0x1d, 0x27, 0x15, 0x3b,
-  0x85, 0xe2, 0xa0, 0xa8, 0x43, 0x6a, 0xa2, 0x0c,
-  0x1b, 0x9e, 0xfa, 0x01, 0x4a, 0xa9, 0xac, 0x84,
-  0x46, 0x2e, 0x42, 0x56, 0x7b, 0x4e, 0x17, 0x1d,
-  0x26, 0x1d, 0x36, 0x3b, 0x63, 0x62, 0xd1, 0x0c,
-  0xf8, 0x38, 0xd7, 0x98, 0x74, 0xfc, 0xa8, 0xd3,
-  0x90, 0x05, 0x4b, 0xc7, 0x4f, 0xf3, 0xda, 0x3b,
-  0x6b, 0x69, 0xdf, 0x3a, 0x7e, 0xf2, 0x31, 0xec,
-  0x09, 0xd3, 0xec, 0x79, 0x98, 0xc3, 0xa7, 0x53,
-  0xc2, 0x74, 0x7c, 0xf0, 0xae, 0x4f, 0x3f, 0x7f,
-  0x80, 0x0d, 0x28, 0x74, 0xfd, 0xed, 0x7b, 0xd1,
-  0x95, 0xd9, 0x30, 0xcc, 0x10, 0x13, 0xda, 0x37,
-  0xdc, 0x8a, 0x31, 0x3d, 0x1f, 0x14, 0x7e, 0x33,
-  0x89, 0xef, 0xe3, 0xda, 0x1d, 0x0e, 0x57, 0xaf,
-  0x85, 0x76, 0x87, 0xef, 0xd5, 0xe9, 0x1f, 0xfd,
-  0xcd, 0xa7, 0x04, 0x21, 0x2a, 0x70, 0xb9, 0x0a,
-  0xa9, 0x79, 0x3f, 0x3c, 0xd3, 0x9b, 0x82, 0xf1,
-  0xd3, 0xd6, 0xe7, 0xc2, 0x74, 0xf9, 0xe1, 0xf2,
-  0x30, 0xe9, 0xff, 0xe4, 0xdf, 0x7f, 0xa0, 0x3a,
-  0xe0, 0xdf, 0xf7, 0x1d, 0x1a, 0xa1, 0x1a, 0x1e,
-  0x34, 0xe2, 0x2b, 0x93, 0xce, 0x77, 0xbe, 0x74,
-  0xfd, 0x74, 0x6b, 0xfa, 0x50, 0xe8, 0x71, 0xe5,
-  0xdc, 0x72, 0x76, 0x9a, 0x37, 0x67, 0x4d, 0xd5,
-  0x6e, 0x8d, 0xbf, 0xae, 0xa9, 0x1b, 0x6a, 0x98,
-  0x44, 0x91, 0xfc, 0x3d, 0x0f, 0x97, 0x10, 0xed,
-  0x18, 0x76, 0x4a, 0x93, 0xd6, 0xc2, 0xa2, 0xfe,
-  0x84, 0x93, 0x50, 0xc3, 0x12, 0x36, 0x46, 0x05,
-  0x69, 0x60, 0x1c, 0x8b, 0xf2, 0x9a, 0x4a, 0x6f,
-  0xbc, 0xee, 0x8e, 0x8f, 0xed, 0xf0, 0xf9, 0xdf,
-  0x08, 0xdd, 0x42, 0x29, 0xff, 0xd5, 0x67, 0x3a,
-  0xb8, 0x2b, 0xdc, 0xa6, 0x8a, 0x2a, 0x7f, 0x57,
-  0x05, 0x7b, 0x94, 0xd1, 0x74, 0x4f, 0xfd, 0x5e,
-  0x75, 0x70, 0x57, 0xb9, 0x4d, 0x12, 0x5c, 0xfe,
-  0xae, 0x0a, 0xf7, 0x29, 0xa2, 0xf2, 0x84, 0x6f,
-  0x40, 0x1e, 0x27, 0x71, 0xde, 0x1d, 0xaa, 0x93,
-  0x47, 0x6c, 0x3b, 0xb4, 0x31, 0x7f, 0x5c, 0x0b,
-  0xd2, 0x3a, 0xbb, 0xa9, 0x68, 0x76, 0xd9, 0x32,
-  0x7f, 0xf5, 0x59, 0xce, 0xae, 0x0a, 0xf7, 0x29,
-  0xa2, 0x59, 0x9e, 0x5e, 0xe5, 0x34, 0x46, 0x73,
-  0xf7, 0x91, 0x8f, 0x60, 0x4e, 0x9b, 0xee, 0x3a,
-  0x4c, 0x3a, 0x7d, 0xe1, 0xb7, 0x54, 0x4f, 0x4d,
-  0x85, 0xbb, 0xc5, 0xa7, 0xee, 0x77, 0x87, 0x84,
-  0xe9, 0xd4, 0x47, 0xce, 0x81, 0x4c, 0x41, 0x8f,
-  0xdf, 0x4c, 0xb9, 0x54, 0xff, 0xd7, 0xf0, 0xf0,
-  0x37, 0x3e, 0xe4, 0x61, 0xd3, 0xef, 0xa3, 0xa9,
-  0xc7, 0x47, 0x8f, 0xb1, 0xb2, 0x34, 0xff, 0xfd,
-  0xed, 0xb4, 0xbd, 0x1f, 0x72, 0x7c, 0x14, 0xdd,
-  0xa7, 0xce, 0x9f, 0xfb, 0x19, 0x7f, 0x06, 0x89,
-  0x6e, 0xd5, 0x9d, 0x3f, 0xeb, 0x27, 0xad, 0xe4,
-  0xfb, 0x5a, 0x1d, 0x2a, 0xe2, 0x76, 0xed, 0x42,
-  0xa7, 0x89, 0x3e, 0xc7, 0x44, 0x79, 0xff, 0xd5,
-  0x67, 0x3a, 0xb8, 0x2b, 0xdc, 0xa6, 0x89, 0xa6,
-  0x7f, 0xf5, 0x59, 0xce, 0xae, 0x0a, 0xf7, 0x29,
-  0xa2, 0x71, 0x9f, 0xfd, 0x56, 0x73, 0xab, 0x82,
-  0xbd, 0xca, 0x68, 0xa0, 0x67, 0xc2, 0xbd, 0xca,
-  0x68, 0xb8, 0x26, 0x4f, 0x1d, 0x3f, 0xbe, 0xe4,
-  0xf6, 0xd8, 0xc3, 0xa5, 0x5c, 0x3f, 0x8b, 0x18,
-  0x68, 0x2b, 0x3f, 0xbd, 0x5d, 0xe8, 0x0c, 0x09,
-  0xd3, 0xfc, 0xea, 0xe0, 0xaf, 0x72, 0x9a, 0x24,
-  0x99, 0x56, 0xc7, 0xeb, 0xc6, 0x90, 0xf2, 0xed,
-  0x6b, 0xa5, 0x8c, 0xaa, 0xab, 0x4a, 0x40, 0x52,
-  0xa4, 0x32, 0xaf, 0x0a, 0xa9, 0xff, 0x6b, 0xea,
-  0xe0, 0xaf, 0x72, 0x9a, 0x2d, 0x49, 0xff, 0x73,
-  0xab, 0x82, 0xbd, 0xca, 0x68, 0x95, 0x60, 0xe9,
-  0x57, 0x5a, 0x26, 0x18, 0x91, 0xa8, 0x8d, 0x3f,
-  0xab, 0x82, 0xbd, 0xca, 0x68, 0x8a, 0x67, 0xf5,
-  0x70, 0x57, 0xb9, 0x4d, 0x11, 0xa4, 0xfe, 0xae,
-  0x0a, 0xf7, 0x29, 0xa2, 0x9f, 0x9f, 0xfd, 0x56,
-  0x73, 0xab, 0x82, 0xbd, 0xca, 0x68, 0x9a, 0xa7,
-  0xf5, 0x70, 0x57, 0xb9, 0x4d, 0x15, 0xdc, 0xf2,
-  0xf7, 0x29, 0xa2, 0xbe, 0x9c, 0x10, 0x84, 0xa9,
-  0x7c, 0xaa, 0x97, 0x90, 0x27, 0xcc, 0xc4, 0x79,
-  0xce, 0x47, 0xce, 0x9f, 0xf6, 0x58, 0x3d, 0x7a,
-  0x26, 0x3c, 0x74, 0xff, 0xbb, 0xc3, 0x8f, 0x79,
-  0xd9, 0xb1, 0xd2, 0xae, 0x22, 0xe1, 0xa2, 0x1f,
-  0x8e, 0x50, 0xf6, 0x7f, 0xf5, 0x59, 0xce, 0xae,
-  0x0a, 0xf7, 0x29, 0xa2, 0x7b, 0x9f, 0xd5, 0xc1,
-  0x5e, 0xe5, 0x34, 0x5c, 0x33, 0xff, 0x57, 0x9d,
-  0x5c, 0x15, 0xee, 0x53, 0x44, 0x9f, 0x08, 0xae,
-  0xcd, 0xe3, 0xb7, 0x1d, 0xeb, 0x3b, 0x53, 0xb6,
-  0x94, 0x86, 0x35, 0x9b, 0x21, 0xd1, 0x49, 0xb1,
-  0xdc, 0xfe, 0xae, 0x0a, 0xf7, 0x29, 0xa2, 0x2a,
-  0x9f, 0xd5, 0xc1, 0x5e, 0xe5, 0x34, 0x53, 0x33,
-  0xff, 0xaa, 0xce, 0x75, 0x70, 0x57, 0xb9, 0x4d,
-  0x13, 0x3c, 0xff, 0xea, 0xb3, 0x9d, 0x5c, 0x15,
-  0xee, 0x53, 0x45, 0x1b, 0x0f, 0x26, 0x35, 0xb1,
-  0xde, 0xb3, 0xbb, 0xa9, 0x4f, 0xfd, 0x5e, 0x75,
-  0x70, 0x57, 0xb9, 0x4d, 0x11, 0xd4, 0xfd, 0xec,
-  0xfe, 0xd8, 0xf1, 0xd3, 0xe1, 0x5e, 0xe5, 0x34,
-  0x53, 0x53, 0xf7, 0x91, 0x8f, 0x60, 0x4e, 0x9f,
-  0xfe, 0xcb, 0xdb, 0x1c, 0x3d, 0xfb, 0xdb, 0x9c,
-  0x74, 0xc8, 0x03, 0xa7, 0xfa, 0x9c, 0xfa, 0x2f,
-  0x96, 0xa2, 0x88, 0xff, 0x96, 0xef, 0x4d, 0x95,
-  0x76, 0x4d, 0x2f, 0x0b, 0xaf, 0x0b, 0xf9, 0xf0,
-  0xaf, 0x72, 0x9a, 0x2a, 0xa9, 0xff, 0x73, 0xab,
-  0x82, 0xbd, 0xca, 0x68, 0x9b, 0x65, 0x5c, 0x3f,
-  0x66, 0x18, 0x4f, 0xea, 0xe0, 0xaf, 0x72, 0x9a,
-  0x2b, 0xf9, 0xfd, 0x5c, 0x15, 0xee, 0x53, 0x45,
-  0x8d, 0x3e, 0x15, 0xee, 0x53, 0x45, 0xab, 0x3f,
-  0xee, 0x75, 0x70, 0x57, 0xb9, 0x4d, 0x14, 0x14,
-  0xab, 0x87, 0xec, 0xc3, 0x09, 0xfd, 0x5c, 0x15,
-  0xee, 0x53, 0x45, 0xc5, 0x3f, 0xab, 0x82, 0xbd,
-  0xca, 0x68, 0xba, 0x67, 0xff, 0xdf, 0xea, 0xdd,
-  0xd8, 0x23, 0xce, 0x7b, 0x02, 0x74, 0xfd, 0xaa,
-  0xff, 0x2d, 0xd7, 0x3a, 0x7e, 0x07, 0x34, 0xef,
-  0x5c, 0xe9, 0xe5, 0xee, 0x53, 0x44, 0x99, 0x3f,
-  0xc3, 0x8f, 0xde, 0xfc, 0xea, 0x1d, 0x02, 0x7c,
-  0x6c, 0x2b, 0x9f, 0xb6, 0x06, 0xab, 0x40, 0x37,
-  0x9d, 0x3e, 0xcb, 0xf9, 0x9c, 0x74, 0xff, 0xfb,
-  0x94, 0x52, 0xdf, 0xcb, 0xe5, 0x42, 0x10, 0x95,
-  0x0e, 0x3f, 0x8b, 0x93, 0x4f, 0xfe, 0xd3, 0xfd,
-  0x74, 0x1a, 0x59, 0x3f, 0x73, 0xa7, 0x04, 0x21,
-  0x2a, 0x7e, 0x1e, 0x79, 0x9e, 0xa1, 0x55, 0x2f,
-  0x27, 0xd8, 0xc1, 0xcd, 0x59, 0xd3, 0xfe, 0x62,
-  0x2d, 0xbf, 0xa5, 0xd2, 0x87, 0x4f, 0xf6, 0x70,
-  0x37, 0x66, 0xdc, 0xe3, 0xa7, 0xff, 0x73, 0xd6,
-  0xf2, 0x7f, 0x1a, 0xf0, 0xf8, 0xe8, 0xc4, 0x60,
-  0xdc, 0xf8, 0x27, 0x33, 0xf6, 0xaf, 0xf9, 0x6e,
-  0xb9, 0xd3, 0xd7, 0x7b, 0x36, 0x3a, 0x7f, 0xbd,
-  0xaf, 0x78, 0x81, 0x9e, 0xa1, 0xd0, 0xd1, 0xf0,
-  0x37, 0x91, 0xce, 0x08, 0x42, 0x74, 0xff, 0xfb,
-  0x19, 0x7f, 0xa0, 0x33, 0x6a, 0x63, 0x11, 0x4a,
-  0xa9, 0x79, 0x18, 0x99, 0xa7, 0xa1, 0x21, 0x64,
-  0x29, 0xfc, 0x23, 0xc3, 0xf4, 0x71, 0xd3, 0x3a,
-  0xad, 0xc5, 0xd0, 0x64, 0x31, 0xc8, 0x48, 0xeb,
-  0x21, 0x7e, 0x15, 0xed, 0x11, 0x73, 0x2f, 0xcf,
-  0x29, 0x0e, 0xab, 0xc6, 0xc7, 0xbc, 0xd6, 0x7d,
-  0x8c, 0x1c, 0xd5, 0x9d, 0x3f, 0xf6, 0x5b, 0xe8,
-  0xf6, 0xfb, 0x5b, 0xb5, 0x67, 0x4f, 0xdc, 0xb5,
-  0x08, 0x42, 0x74, 0xaa, 0xab, 0xd7, 0x7d, 0x3a,
-  0xb3, 0xf8, 0x61, 0xd0, 0xa5, 0xb2, 0x54, 0x39,
-  0x96, 0x29, 0xb4, 0x72, 0xef, 0xc2, 0xc8, 0x49,
-  0xd8, 0x76, 0x08, 0x58, 0xd0, 0x9e, 0xe7, 0x7a,
-  0x4f, 0x7b, 0x4f, 0xea, 0xe0, 0xaf, 0x72, 0x9a,
-  0x23, 0x59, 0xf0, 0xaf, 0x72, 0x9a, 0x2a, 0x59,
-  0xb9, 0x4d, 0x10, 0xd4, 0xab, 0x87, 0xa3, 0xc6,
-  0x13, 0xff, 0x57, 0x9d, 0x5c, 0x15, 0xee, 0x53,
-  0x44, 0x7d, 0x3f, 0xab, 0x82, 0xbd, 0xca, 0x68,
-  0xb1, 0xe7, 0xed, 0x57, 0xf9, 0x6e, 0xb9, 0xd3,
-  0xfd, 0xfe, 0x05, 0x3a, 0xf7, 0xe3, 0xa7, 0x80,
-  0xcf, 0x09, 0xd3, 0xff, 0xfc, 0x83, 0xfc, 0xdb,
-  0x2d, 0x6f, 0x2d, 0xbd, 0x7a, 0x73, 0xe7, 0x47,
-  0x91, 0x0f, 0x62, 0x19, 0xf0, 0xaf, 0x72, 0x9a,
-  0x2d, 0x09, 0xf9, 0xb6, 0xfb, 0xfd, 0x00, 0x74,
-  0xf9, 0x2f, 0x96, 0x43, 0xa7, 0xff, 0xb2, 0xf4,
-  0xc6, 0xac, 0x8d, 0xb2, 0xd6, 0x43, 0xa1, 0xe3,
-  0xf5, 0xf9, 0x2c, 0x22, 0x32, 0x72, 0x14, 0xd3,
-  0xfd, 0xfc, 0xcb, 0xdb, 0xbf, 0xac, 0xe9, 0xfd,
-  0x96, 0x6b, 0xd6, 0xf3, 0x0e, 0x9f, 0xce, 0xc1,
-  0xa7, 0xd1, 0xe3, 0xa7, 0xb6, 0xcb, 0x71, 0xd3,
-  0xfd, 0x98, 0x1c, 0x55, 0xc0, 0x9d, 0x18, 0x8b,
-  0xb7, 0xcd, 0x38, 0xca, 0x84, 0x33, 0xd9, 0x6e,
-  0xb9, 0xd3, 0xfb, 0x5f, 0xbf, 0xa3, 0xb2, 0x87,
-  0x4a, 0xad, 0xc5, 0x76, 0xe8, 0x63, 0xb4, 0x2f,
-  0xb0, 0x8e, 0xd0, 0xf9, 0xa1, 0x35, 0xe1, 0xe8,
-  0xde, 0x79, 0xbc, 0x82, 0x7e, 0xd4, 0xf6, 0xdf,
-  0x46, 0x8e, 0x9e, 0xcb, 0x75, 0xce, 0x96, 0xab,
-  0x87, 0xa5, 0xf3, 0x29, 0xf0, 0xaf, 0x72, 0x9a,
-  0x2d, 0x69, 0xff, 0x73, 0xab, 0x82, 0xbd, 0xca,
-  0x68, 0xa0, 0xe5, 0x56, 0xe2, 0x28, 0xb0, 0xb1,
-  0x86, 0x13, 0xff, 0xaa, 0xce, 0x75, 0x70, 0x57,
-  0xb9, 0x4d, 0x14, 0x5c, 0xfe, 0xae, 0x0a, 0xf7,
-  0x29, 0xa2, 0xea, 0x87, 0x2f, 0xa3, 0xac, 0x23,
-  0x3c, 0x4c, 0xc4, 0xcb, 0x4b, 0xf2, 0x04, 0x72,
-  0x34, 0x39, 0xba, 0x94, 0xf8, 0x57, 0xb9, 0x4d,
-  0x11, 0x0c, 0xeb, 0x66, 0xc7, 0x4a, 0xb8, 0x79,
-  0x8f, 0x98, 0x4f, 0xea, 0xe0, 0xaf, 0x72, 0x9a,
-  0x23, 0x69, 0xfd, 0x5c, 0x15, 0xee, 0x53, 0x45,
-  0x37, 0x3f, 0xab, 0x82, 0xbd, 0xca, 0x68, 0xa8,
-  0x27, 0xf5, 0x70, 0x57, 0xb9, 0x4d, 0x15, 0x34,
-  0xf8, 0x57, 0xb9, 0x4d, 0x15, 0x84, 0xfb, 0xc1,
-  0xdb, 0x41, 0x3a, 0x7f, 0x9d, 0x5c, 0x15, 0xee,
-  0x53, 0x44, 0x7f, 0x3b, 0x11, 0xe3, 0xa5, 0x5c,
-  0x45, 0xaa, 0x98, 0x71, 0x4f, 0xd0, 0x67, 0xff,
-  0x55, 0x9c, 0xea, 0xe0, 0xaf, 0x72, 0x9a, 0x26,
-  0xf9, 0xff, 0x99, 0xce, 0xae, 0x0a, 0xf7, 0x29,
-  0xa2, 0x7e, 0x9f, 0x9b, 0xae, 0xa8, 0xd5, 0x5b,
-  0xf1, 0xf3, 0xa7, 0xff, 0x91, 0x11, 0x11, 0x11,
-  0x11, 0x1f, 0xa1, 0xd3, 0xe1, 0xf3, 0xdc, 0xc2,
-  0xa6, 0x08, 0x4a, 0x8c, 0x37, 0xa1, 0x27, 0x96,
-  0x85, 0x54, 0xd0, 0x42, 0x23, 0x1e, 0x90, 0xa6,
-  0x9f, 0x87, 0x96, 0xde, 0x13, 0xa7, 0x9e, 0x67,
-  0x9c, 0x74, 0xfe, 0xb2, 0x32, 0xa0, 0x02, 0x1d,
-  0x21, 0x43, 0xd5, 0xf1, 0x1c, 0xe0, 0x53, 0x0e,
-  0x9f, 0xfb, 0x64, 0xbf, 0x53, 0x2d, 0x6f, 0x30,
-  0xe9, 0xd7, 0xf3, 0x47, 0x42, 0x1f, 0x0d, 0x11,
-  0x21, 0x13, 0x69, 0xf1, 0x38, 0xbf, 0xfc, 0x9a,
-  0xef, 0x93, 0xdc, 0xd6, 0xf6, 0x1d, 0x37, 0x7c,
-  0xe8, 0x13, 0x72, 0xc2, 0x49, 0xc1, 0x08, 0x4e,
-  0x9e, 0x7b, 0xfe, 0x42, 0xaa, 0x5e, 0x4f, 0x3f,
-  0x7f, 0x29, 0xd0, 0x88, 0x8f, 0xb1, 0xe6, 0x86,
-  0x33, 0xff, 0x3d, 0xa0, 0x33, 0xfa, 0x34, 0x97,
-  0xe3, 0xa7, 0x92, 0xf4, 0x53, 0x44, 0x1d, 0x3f,
-  0x75, 0x93, 0x57, 0xa3, 0x8e, 0x81, 0x45, 0x2d,
-  0xd1, 0xdb, 0x16, 0xcc, 0x3b, 0x1d, 0x30, 0x42,
-  0x74, 0x38, 0xd6, 0x04, 0x5a, 0x7a, 0x89, 0xe6,
-  0xc5, 0x54, 0xd0, 0xcf, 0xa9, 0xbf, 0x60, 0x50,
-  0xe8, 0xf1, 0xef, 0x6f, 0x33, 0x9c, 0x10, 0x84,
-  0xa8, 0x2a, 0xa5, 0xe4, 0xf7, 0x83, 0xe6, 0x8a,
-  0x85, 0x37, 0x9e, 0x19, 0x8f, 0x26, 0xf1, 0x68,
-  0x6e, 0x7d, 0xf2, 0x7b, 0x6e, 0xf8, 0x0e, 0x9f,
-  0xf9, 0x3e, 0x0f, 0xa3, 0xed, 0x27, 0xc0, 0x74,
-  0x00, 0xf9, 0xe8, 0x45, 0x3f, 0x34, 0x98, 0x36,
-  0xf1, 0xd3, 0xf5, 0xf1, 0xaf, 0xa3, 0x0f, 0x10,
-  0x14, 0xfb, 0xbf, 0xb5, 0x90, 0xd1, 0x01, 0x54,
-  0xdd, 0x4f, 0x90, 0x1e, 0x7e, 0x87, 0x4f, 0xe1,
-  0x6a, 0x9e, 0xfd, 0xfc, 0x74, 0xf3, 0xe0, 0x14,
-  0x2a, 0x60, 0x84, 0xa8, 0x43, 0x6e, 0x12, 0x19,
-  0xfb, 0x85, 0xce, 0xff, 0x8a, 0xa9, 0xa0, 0x84,
-  0x4e, 0xef, 0x08, 0xbc, 0xcd, 0xf4, 0x4b, 0x94,
-  0x69, 0x08, 0xb9, 0xf6, 0x97, 0xd3, 0xb7, 0x9a,
-  0x20, 0x79, 0xff, 0x5b, 0x47, 0x93, 0x72, 0x5d,
-  0x36, 0x3a, 0x77, 0x0b, 0xc7, 0x4c, 0x10, 0x9d,
-  0x3f, 0x87, 0xd8, 0xdb, 0x7b, 0xaa, 0xa6, 0xc4,
-  0x23, 0x71, 0xb2, 0x2f, 0xc5, 0xce, 0x7f, 0xef,
-  0xe6, 0xbb, 0x73, 0xb7, 0xf3, 0xe8, 0x74, 0x21,
-  0xf5, 0x61, 0x1c, 0xff, 0xec, 0x63, 0x39, 0xd8,
-  0x2b, 0xdc, 0xa6, 0x88, 0x62, 0x2c, 0x7e, 0x3f,
-  0x20, 0x9f, 0xb0, 0x57, 0xb9, 0x4d, 0x10, 0x54,
-  0xf5, 0xe8, 0x80, 0x2a, 0x77, 0x0b, 0xc5, 0x4f,
-  0x69, 0xfe, 0xd6, 0x54, 0xfe, 0xf3, 0xd9, 0x7a,
-  0x20, 0x0a, 0x82, 0xa7, 0xec, 0x54, 0xb2, 0x30,
-  0xa9, 0x82, 0x12, 0xa7, 0xef, 0xa7, 0xde, 0xf0,
-  0x95, 0x18, 0x98, 0x52, 0x90, 0xb0, 0x6e, 0xc4,
-  0x80, 0x33, 0xf8, 0x50, 0x4a, 0xb7, 0x8b, 0x4d,
-  0xe1, 0x2a, 0xa7, 0xe5, 0x2e, 0x72, 0x7a, 0xf6,
-  0x8e, 0xc6, 0x7f, 0xc8, 0xee, 0xfe, 0x50, 0x52,
-  0x87, 0x4f, 0xf9, 0x2f, 0x64, 0x6d, 0xb2, 0x01,
-  0x0e, 0x9f, 0xff, 0x9a, 0xee, 0x77, 0x5b, 0x76,
-  0x3d, 0xa5, 0xf4, 0xed, 0xe6, 0x8b, 0xee, 0x7d,
-  0xeb, 0xff, 0x1c, 0x74, 0xff, 0xbf, 0xe7, 0x5e,
-  0xd8, 0x3e, 0xa1, 0xd3, 0xfa, 0xe0, 0xdf, 0xf7,
-  0x5b, 0x0f, 0x10, 0x0c, 0xee, 0x17, 0x1e, 0x20,
-  0x18, 0xc3, 0xe9, 0xd1, 0x0a, 0x6e, 0x71, 0xe2,
-  0x01, 0x9e, 0xef, 0xbe, 0xe3, 0xc4, 0x03, 0x3f,
-  0xbc, 0xb6, 0xc0, 0x01, 0x0f, 0x10, 0x0c, 0xef,
-  0x7f, 0x63, 0xc4, 0x03, 0x1b, 0x22, 0xe5, 0x84,
-  0x56, 0x2f, 0x6c, 0x7d, 0x38, 0x52, 0xe7, 0x88,
-  0x06, 0x0f, 0x10, 0x0c, 0xc8, 0xc3, 0xc4, 0x03,
-  0x1b, 0x1b, 0x9f, 0x0b, 0xcf, 0x79, 0x9b, 0x21,
-  0xe2, 0x01, 0x9d, 0x7e, 0x53, 0xc4, 0x03, 0x3f,
-  0xef, 0xf3, 0xab, 0x6f, 0x2f, 0x09, 0xe2, 0x01,
-  0x9b, 0xb6, 0x3c, 0x40, 0x33, 0xfb, 0xfc, 0x1a,
-  0x51, 0x00, 0x78, 0x80, 0x67, 0xde, 0xd7, 0xdf,
-  0x01, 0xe2, 0x01, 0x9b, 0xd4, 0x3c, 0x40, 0x30,
-  0x27, 0xb3, 0x73, 0x69, 0xf5, 0xfe, 0x8f, 0xb8,
-  0xd1, 0x00, 0xcc, 0x04, 0x3c, 0x40, 0x35, 0x36,
-  0xb3, 0xef, 0x23, 0x3b, 0x63, 0xc4, 0x03, 0x3d,
-  0xa7, 0x7d, 0x4f, 0x10, 0x0c, 0xe4, 0x15, 0x3c,
-  0x40, 0x33, 0xfe, 0xc7, 0xe9, 0xb2, 0x67, 0xc1,
-  0x43, 0xc4, 0x03, 0x3e, 0xd3, 0x9c, 0xe4, 0x3c,
-  0x40, 0x31, 0x88, 0x80, 0xb2, 0x64, 0xc2, 0x03,
-  0xc4, 0x03, 0x0e, 0x55, 0x1f, 0xb1, 0x1e, 0x42,
-  0x63, 0xca, 0xd6, 0x32, 0x01, 0xa5, 0x0b, 0xaf,
-  0x0a, 0x6d, 0x08, 0xa7, 0xd9, 0x7a, 0x73, 0xe7,
-  0x88, 0x06, 0x7f, 0x6c, 0x8a, 0xd0, 0xa5, 0xcf,
-  0x10, 0x0e, 0xc6, 0xd2, 0x70, 0xa0, 0x4f, 0x10,
-  0x0c, 0x29, 0xfb, 0x8a, 0x84, 0xf7, 0xbe, 0xea,
-  0x1e, 0x20, 0x19, 0xfb, 0x9a, 0x76, 0x3e, 0xe3,
-  0xc4, 0x03, 0x18, 0x88, 0xa0, 0x10, 0x68, 0x5f,
-  0x3f, 0xd6, 0x4a, 0x56, 0x9a, 0x08, 0x0f, 0x10,
-  0x0c, 0xbc, 0x78, 0x80, 0x66, 0xe7, 0xb6, 0x3e,
-  0x3b, 0x23, 0x4c, 0x20, 0x3c, 0x40, 0x33, 0xee,
-  0xbd, 0x3c, 0xf9, 0xe2, 0x01, 0x9f, 0xbd, 0xfd,
-  0x1d, 0x94, 0x3c, 0x40, 0x30, 0x88, 0x92, 0xf9,
-  0x15, 0xcd, 0x63, 0x66, 0x40, 0x76, 0x43, 0x6d,
-  0xa4, 0x01, 0x60, 0xb1, 0x17, 0x17, 0x80, 0x9e,
-  0x92, 0xb6, 0x2f, 0x1e, 0x03, 0x7c, 0x24, 0xf7,
-  0xc3, 0x06, 0x77, 0x72, 0x9a, 0x20, 0x1a, 0xa2,
-  0xf2, 0x7b, 0x5e, 0xa9, 0x6c, 0xc3, 0xa6, 0x02,
-  0x15, 0x2d, 0x65, 0x4e, 0xb2, 0x3c, 0x74, 0xc1,
-  0x09, 0x51, 0xe3, 0xd9, 0xd5, 0x8a, 0xb4, 0x24,
-  0x11, 0xc9, 0xcc, 0xf5, 0x0a, 0xa9, 0xe0, 0xcf,
-  0x5e, 0x9a, 0x9a, 0x1d, 0x0f, 0x32, 0xba, 0x5c,
-  0x4e, 0xb4, 0x97, 0x1f, 0x1c, 0x02, 0x18, 0xdb,
-  0xcb, 0x67, 0xe1, 0x69, 0xc8, 0x2f, 0x1d, 0x3f,
-  0xe7, 0x53, 0x77, 0xf1, 0x88, 0x3a, 0xce, 0x9f,
-  0xb7, 0x84, 0x7d, 0x96, 0x2a, 0x79, 0xab, 0x73,
-  0x47, 0x4f, 0xb1, 0xa7, 0x23, 0xe7, 0x4f, 0x67,
-  0xd1, 0xc5, 0x40, 0x9f, 0x5f, 0xc8, 0xf5, 0x0a,
-  0x21, 0x13, 0x38, 0xc2, 0xdb, 0x20, 0xf4, 0x26,
-  0x67, 0xbd, 0xfb, 0xd0, 0xe9, 0xda, 0x37, 0x74,
-  0x3a, 0x7f, 0xe0, 0x33, 0x16, 0xde, 0xda, 0xda,
-  0x6b, 0x3a, 0x7f, 0xeb, 0xd3, 0x36, 0x47, 0xe9,
-  0x8f, 0xdc, 0xe8, 0x44, 0x58, 0x78, 0x8b, 0x92,
-  0x27, 0xdc, 0xdb, 0x6d, 0x90, 0xe9, 0xa9, 0x43,
-  0xa7, 0x04, 0x21, 0x3a, 0x60, 0x71, 0x55, 0x2f,
-  0x20, 0x4f, 0x5a, 0x86, 0x53, 0xb8, 0x18, 0x54,
-  0x39, 0x17, 0x6c, 0x84, 0x03, 0x79, 0x0c, 0xfe,
-  0xbf, 0xf1, 0xf0, 0x6f, 0x71, 0xd3, 0xfd, 0xfc,
-  0x6d, 0x95, 0x08, 0x42, 0x54, 0xe6, 0x75, 0xce,
-  0x8b, 0x1e, 0xab, 0x63, 0xa8, 0x44, 0x73, 0xf8,
-  0xe3, 0xa1, 0x17, 0x35, 0xb8, 0xe9, 0x9a, 0xa1,
-  0xd3, 0xf5, 0x71, 0xb7, 0xbf, 0xb6, 0x1a, 0xcd,
-  0xe2, 0xb3, 0xdb, 0x65, 0xb8, 0xe9, 0xff, 0x93,
-  0x3e, 0xeb, 0x67, 0xfe, 0x81, 0x3a, 0x5e, 0x14,
-  0x55, 0xfd, 0x22, 0xe4, 0x30, 0xf3, 0x6b, 0x1e,
-  0xe8, 0xf4, 0xb6, 0x8f, 0xe7, 0x59, 0x7a, 0x9d,
-  0xf8, 0xfc, 0x69, 0x6a, 0xf6, 0x8e, 0x8c, 0x08,
-  0x1f, 0x86, 0x95, 0xe3, 0xd0, 0x6d, 0x18, 0x54,
-  0xfd, 0xf0, 0x66, 0xdc, 0xe3, 0xa7, 0xdb, 0xda,
-  0x72, 0x6a, 0xca, 0x8c, 0x3d, 0xbd, 0xe5, 0xb3,
-  0xff, 0x87, 0x5f, 0xf4, 0xed, 0xf9, 0x4f, 0x27,
-  0xce, 0x96, 0xf3, 0x44, 0x0b, 0x2b, 0x9a, 0x81,
-  0x49, 0x7a, 0xe6, 0xf0, 0x23, 0xf3, 0xfe, 0xf3,
-  0x7d, 0xbd, 0xbe, 0xa0, 0x02, 0x15, 0x3f, 0xfa,
-  0xf4, 0xe7, 0xf7, 0x31, 0x33, 0xf7, 0x6f, 0x3a,
-  0x11, 0x12, 0x7e, 0x44, 0x9c, 0xf7, 0xdc, 0x74,
-  0x22, 0x70, 0x4c, 0x84, 0x4d, 0xa1, 0x75, 0xa1,
-  0x14, 0xfe, 0x73, 0x59, 0xfe, 0xb6, 0x1d, 0x3f,
-  0xf8, 0x57, 0xf8, 0xdb, 0xf8, 0x82, 0x94, 0x3a,
-  0x7f, 0x73, 0x56, 0xc6, 0x65, 0x0e, 0x8c, 0x3f,
-  0x96, 0xc8, 0xf3, 0xec, 0xdb, 0xc3, 0x43, 0xa7,
-  0xff, 0xa9, 0x77, 0xd7, 0xd6, 0xdd, 0xa9, 0x96,
-  0xf3, 0x0e, 0x92, 0x3c, 0x7f, 0xa1, 0x27, 0x8f,
-  0x23, 0x22, 0xf0, 0xa0, 0x9d, 0xb7, 0x09, 0xd3,
-  0xe0, 0x77, 0xf3, 0x50, 0xe8, 0x43, 0xc4, 0xd0,
-  0x6e, 0x79, 0x18, 0xfb, 0x47, 0x42, 0x2a, 0x24,
-  0x74, 0x6e, 0x74, 0x6c, 0xb9, 0x14, 0xf0, 0x39,
-  0xfa, 0x1d, 0x30, 0x42, 0x74, 0x50, 0xdc, 0x04,
-  0x8a, 0x7e, 0xa7, 0xad, 0xd9, 0x62, 0xaa, 0x68,
-  0x67, 0x04, 0x21, 0x2a, 0x79, 0xd7, 0xc5, 0x2a,
-  0xa5, 0xe4, 0xfb, 0x36, 0xf0, 0x28, 0x74, 0xb8,
-  0x4f, 0x5f, 0xe5, 0xf3, 0xf7, 0xdf, 0xa3, 0x59,
-  0x73, 0xa7, 0xcf, 0x6a, 0xfd, 0x8f, 0x9d, 0x3f,
-  0xec, 0x5d, 0xb0, 0x43, 0xd6, 0x68, 0xe9, 0x9c,
-  0xf1, 0x50, 0xf9, 0xea, 0x7c, 0xf6, 0x05, 0x14,
-  0x9d, 0x08, 0x18, 0x44, 0xc7, 0xf0, 0x9b, 0xa1,
-  0xa7, 0x3f, 0xed, 0x68, 0xff, 0xd2, 0xd6, 0xd1,
-  0x4e, 0x9f, 0xbf, 0xda, 0xed, 0xce, 0x3a, 0x70,
-  0x42, 0x12, 0xa7, 0x6f, 0x40, 0x15, 0x52, 0xf2,
-  0x7f, 0xdf, 0xe7, 0x6f, 0x1c, 0x6d, 0xc2, 0x74,
-  0xff, 0x7f, 0x81, 0xb9, 0xc8, 0x07, 0xce, 0x8d,
-  0x93, 0x31, 0x62, 0x08, 0x12, 0xbe, 0x59, 0x73,
-  0xf9, 0xc1, 0x08, 0x4b, 0x10, 0x84, 0xf8, 0x57,
-  0xb9, 0x4b, 0x10, 0x85, 0x4d, 0x4c, 0xe0, 0x84,
-  0x25, 0x88, 0x3e, 0x0b, 0x10, 0x7d, 0x4d, 0x4c,
-  0xc8, 0xcc, 0x44, 0x82, 0xb4, 0xcf, 0xae, 0x97,
-  0x46, 0x1d, 0x3d, 0xff, 0x26, 0xb3, 0xa7, 0x6f,
-  0x40, 0x1d, 0x0f, 0x1e, 0x03, 0x08, 0xe7, 0xca,
-  0x96, 0x46, 0x15, 0x3e, 0xff, 0x7f, 0xf8, 0x54,
-  0xd8, 0xa5, 0x4c, 0x10, 0x95, 0x18, 0x7e, 0xb4,
-  0x25, 0xb9, 0x30, 0x45, 0x27, 0xf7, 0xf7, 0xa0,
-  0x2d, 0x9a, 0x85, 0x54, 0xdd, 0xc2, 0x27, 0x01,
-  0xe6, 0x6e, 0x86, 0x9c, 0xff, 0xeb, 0x20, 0x29,
-  0x99, 0xb7, 0x7f, 0xb5, 0x9d, 0x3f, 0xa9, 0xbd,
-  0x94, 0x0f, 0x3e, 0x74, 0x22, 0xb6, 0x5f, 0x46,
-  0x0a, 0x31, 0xd6, 0x71, 0xa5, 0x12, 0xa7, 0x04,
-  0x21, 0x2a, 0x7c, 0xe0, 0x77, 0xf6, 0x2a, 0xa5,
-  0xe4, 0xff, 0xf7, 0xdf, 0xdc, 0xf8, 0x13, 0xeb,
-  0xcf, 0x7f, 0x8e, 0x9f, 0xff, 0x3b, 0x12, 0xbb,
-  0x7d, 0x34, 0x5c, 0xd7, 0xe1, 0x3a, 0x7b, 0xdb,
-  0x63, 0x0e, 0x84, 0x4c, 0x09, 0xc6, 0xfc, 0xa7,
-  0xa2, 0xb4, 0xfd, 0xab, 0xa7, 0xbe, 0xfb, 0x8e,
-  0x9f, 0xf5, 0x28, 0x83, 0x74, 0xae, 0xde, 0x3a,
-  0x7f, 0xdf, 0xe6, 0xad, 0xc2, 0x3e, 0xd8, 0xe8,
-  0xc4, 0x57, 0xf8, 0xcd, 0x87, 0xd3, 0xf7, 0x0e,
-  0xd9, 0x9f, 0x3a, 0x7f, 0xfb, 0x2f, 0x4c, 0x6a,
-  0xc8, 0xdb, 0x2d, 0x64, 0x3a, 0x7f, 0x5d, 0xba,
-  0xb5, 0xf6, 0xe8, 0xf6, 0x87, 0x46, 0xc8, 0xbe,
-  0xf9, 0x5d, 0xd4, 0x27, 0xff, 0xbd, 0x4c, 0xda,
-  0xf4, 0xf6, 0xbb, 0x77, 0xfc, 0x74, 0xff, 0xfe,
-  0xfd, 0xf2, 0xde, 0x4b, 0xf8, 0x08, 0xea, 0x84,
-  0x21, 0x2a, 0x7b, 0x6c, 0xcd, 0x65, 0x4e, 0x77,
-  0xf4, 0x34, 0x43, 0x33, 0x82, 0x10, 0x95, 0x3b,
-  0x3e, 0xa5, 0x54, 0xbc, 0x9f, 0xf6, 0x3d, 0x9b,
-  0x73, 0xbe, 0x8f, 0x1d, 0x00, 0x3e, 0x8f, 0x94,
-  0xc2, 0x26, 0xa8, 0xf3, 0x0b, 0xe4, 0x63, 0x0a,
-  0xe9, 0xef, 0x5f, 0xc8, 0x74, 0xfe, 0xd3, 0x04,
-  0x00, 0xf7, 0xce, 0x9f, 0xff, 0x23, 0xbd, 0xb5,
-  0xb7, 0xd3, 0x05, 0x7b, 0x94, 0xd1, 0x06, 0x45,
-  0x91, 0x29, 0x73, 0x39, 0xfc, 0xdf, 0x94, 0x6f,
-  0xc1, 0x43, 0xa1, 0xc9, 0x87, 0x7a, 0x16, 0xb7,
-  0x23, 0x9f, 0xfe, 0x4f, 0xbd, 0xb9, 0xaf, 0x7f,
-  0x36, 0xcf, 0xeb, 0x3a, 0x72, 0x0b, 0x47, 0x42,
-  0x2e, 0x5e, 0xe4, 0x3b, 0x54, 0xc7, 0xd1, 0xd3,
-  0xf4, 0x6a, 0x3a, 0x1b, 0x37, 0xab, 0x4f, 0xeb,
-  0xf9, 0xb7, 0xae, 0xe4, 0x2a, 0x4c, 0x3a, 0x7f,
-  0x53, 0x3f, 0xac, 0x52, 0xbe, 0x3c, 0x5d, 0xe6,
-  0xb3, 0xc3, 0xa3, 0xee, 0x3a, 0x7f, 0x7d, 0xdf,
-  0xc6, 0x22, 0x9d, 0x39, 0x9b, 0x61, 0xd0, 0x87,
-  0xe1, 0x84, 0x7c, 0x63, 0x3f, 0xed, 0x2f, 0x4d,
-  0xe2, 0x06, 0x7a, 0x87, 0x4f, 0xfc, 0x9f, 0xeb,
-  0x20, 0x2a, 0x34, 0xa1, 0x51, 0xb2, 0x21, 0x18,
-  0x85, 0x3e, 0xb7, 0xbc, 0xfd, 0x0e, 0x82, 0xa7,
-  0xea, 0x6f, 0x41, 0x46, 0x15, 0x05, 0x41, 0x50,
-  0x54, 0x15, 0x0e, 0x3d, 0xff, 0x05, 0x00, 0xb7,
-  0x40, 0xa6, 0xf0, 0xad, 0x40, 0xa9, 0xad, 0x85,
-  0x4f, 0xdd, 0xd7, 0x69, 0x18, 0x56, 0xe2, 0xd6,
-  0x4d, 0xd9, 0x50, 0x54, 0x15, 0x0e, 0x2d, 0x3c,
-  0x15, 0x05, 0x41, 0x50, 0x54, 0x15, 0x05, 0x41,
-  0x50, 0xf1, 0xbc, 0xd8, 0x2b, 0xc1, 0x40, 0x0a,
-  0xa0, 0x53, 0x60, 0xa8, 0x2a, 0x0a, 0x87, 0x16,
-  0x94, 0x0a, 0x82, 0xa0, 0xa8, 0x2a, 0x0a, 0x87,
-  0x1a, 0x80, 0x05, 0x5c, 0x2b, 0x50, 0x2a, 0x0a,
-  0x82, 0xa0, 0xa8, 0x2a, 0x1e, 0x35, 0x1a, 0xc2,
-  0x84, 0x2a, 0xc1, 0x52, 0xd6, 0x54, 0x15, 0x05,
-  0x41, 0x50, 0x54, 0x6c, 0x6a, 0x1f, 0x0a, 0x00,
-  0x56, 0x81, 0x50, 0x54, 0x15, 0x05, 0x4f, 0xac,
-  0x80, 0xa6, 0x15, 0x05, 0x43, 0x8f, 0x39, 0x42,
-  0xac, 0x15, 0xc1, 0x40, 0x26, 0x92, 0x95, 0x05,
-  0x41, 0x50, 0x54, 0x15, 0x0e, 0x35, 0x0f, 0x85,
-  0x78, 0x29, 0xb0, 0x54, 0x15, 0x05, 0x41, 0x50,
-  0x54, 0x38, 0xd4, 0x6c, 0x15, 0x60, 0xaf, 0x85,
-  0x4a, 0xc5, 0x41, 0x50, 0x54, 0x9c, 0x54, 0x14,
-  0xf9, 0x61, 0x05, 0x41, 0x50, 0x54, 0x15, 0x0f,
-  0x1f, 0x33, 0x82, 0xb5, 0x8d, 0x28, 0xd3, 0x41,
-  0x40, 0x0a, 0xb8, 0x54, 0xb0, 0xa8, 0x2a, 0x0a,
-  0x93, 0x8a, 0x82, 0x9f, 0x2c, 0x20, 0xa8, 0x2a,
-  0x10, 0xf4, 0x9c, 0x15, 0xe1, 0xa1, 0x1a, 0x60,
-  0x54, 0x15, 0x05, 0x41, 0x50, 0x54, 0x15, 0x08,
-  0x6c, 0x9f, 0x0a, 0x10, 0xa6, 0x05, 0x7c, 0x2a,
-  0x0a, 0x82, 0xa0, 0xa8, 0x12, 0xfa, 0x81, 0x57,
-  0x0a, 0x82, 0xa0, 0xa8, 0x2a, 0x18, 0x5f, 0x7c,
-  0x2a, 0xe1, 0x52, 0x61, 0x50, 0x54, 0x15, 0x00,
-  0x2d, 0x34, 0x0a, 0x82, 0xa0, 0xa8, 0x2a, 0x0a,
-  0x84, 0x35, 0x0d, 0x05, 0x58, 0x2b, 0x40, 0xa8,
-  0x45, 0xfa, 0xd7, 0x9c, 0x9c, 0x7b, 0xb1, 0x4e,
-  0x2e, 0x2b, 0x6b, 0xe9, 0x1e, 0x66, 0xd5, 0x9e,
-  0xb4, 0x74, 0x30, 0x8c, 0x62, 0x3d, 0x8d, 0xf9,
-  0x98, 0x07, 0x9f, 0x76, 0xa3, 0x35, 0xd8, 0x74,
-  0x79, 0x6c, 0xca, 0x14, 0xa6, 0xf2, 0xdd, 0xe4,
-  0x9a, 0x89, 0x33, 0xe7, 0x7d, 0x32, 0x85, 0x55,
-  0x35, 0x79, 0xde, 0x46, 0x15, 0x3d, 0xe5, 0xe1,
-  0x3a, 0x77, 0xb6, 0xc3, 0xa7, 0x26, 0xfa, 0xbe,
-  0x88, 0xf1, 0x39, 0xb0, 0xdd, 0xc7, 0xe7, 0xf5,
-  0xbc, 0x1d, 0x85, 0x1e, 0x3a, 0x1f, 0x44, 0x23,
-  0x4a, 0x13, 0x01, 0x0e, 0x9f, 0x87, 0xbf, 0xbd,
-  0x00, 0x74, 0xdc, 0x27, 0x4b, 0xc7, 0x29, 0x69,
-  0x25, 0x3a, 0x4c, 0x3a, 0x76, 0x37, 0xd7, 0xc8,
-  0x93, 0x11, 0x5b, 0x20, 0xf0, 0xf6, 0xf0, 0xf9,
-  0xff, 0xf6, 0x89, 0xbb, 0x84, 0x78, 0x09, 0x50,
-  0x84, 0x27, 0x43, 0x99, 0xb3, 0x7b, 0x42, 0xf7,
-  0xd0, 0xb0, 0x68, 0x93, 0xa9, 0x53, 0xff, 0x85,
-  0xc5, 0xd7, 0xa7, 0xf2, 0x7e, 0xfd, 0xfd, 0x30,
-  0xe9, 0xf9, 0xdf, 0xf3, 0xad, 0x87, 0x4f, 0x9e,
-  0xf0, 0xa3, 0x8e, 0x81, 0x3d, 0x4f, 0x96, 0xcf,
-  0xfa, 0xc8, 0x20, 0xfe, 0x07, 0x80, 0x74, 0xec,
-  0xc6, 0x8e, 0x96, 0x58, 0xf5, 0xc0, 0x79, 0x3f,
-  0x53, 0x1b, 0x7d, 0x1f, 0x3a, 0x49, 0x88, 0xce,
-  0xfb, 0xc5, 0xc9, 0xe7, 0xb4, 0xe1, 0x71, 0xd3,
-  0xc9, 0xa3, 0x77, 0x42, 0xa7, 0xce, 0xa8, 0x42,
-  0x13, 0xa3, 0xe7, 0x9f, 0xa1, 0x3c, 0x6c, 0x89,
-  0x3c, 0x70, 0x86, 0x2a, 0x3e, 0x04, 0x6a, 0x9a,
-  0x43, 0x1e, 0x7e, 0x1d, 0x01, 0x9f, 0x53, 0xa7,
-  0xb6, 0xd9, 0x1b, 0x1d, 0x3f, 0xfe, 0x4b, 0x23,
-  0x15, 0x2f, 0x82, 0xbd, 0xca, 0x68, 0xbe, 0x27,
-  0xf0, 0x7a, 0xf4, 0x4c, 0x78, 0xe9, 0xff, 0xfb,
-  0x2f, 0xbd, 0xc8, 0xdb, 0xdf, 0x00, 0xf9, 0x19,
-  0x85, 0x4d, 0x7c, 0x3a, 0x7c, 0x3e, 0x7b, 0x98,
-  0x69, 0x84, 0xe7, 0xaf, 0xa2, 0x71, 0xa6, 0x13,
-  0x98, 0x08, 0x6a, 0x04, 0xe7, 0xf7, 0xfb, 0x5d,
-  0xd0, 0x40, 0x6a, 0x04, 0xe7, 0xf5, 0x32, 0xde,
-  0xa6, 0x8f, 0x1a, 0x61, 0x39, 0xb3, 0x63, 0x4c,
-  0x27, 0x30, 0x42, 0x79, 0x84, 0xe3, 0x13, 0x4c,
-  0x7c, 0xd3, 0xc5, 0xcc, 0x22, 0xa2, 0x03, 0x64,
-  0x20, 0x91, 0xca, 0xe5, 0x98, 0x4e, 0xa7, 0xcf,
-  0x2f, 0x3e, 0x9f, 0xb0, 0x63, 0xc8, 0x8a, 0x2a,
-  0x84, 0xbc, 0xa5, 0x38, 0xd9, 0x5b, 0x12, 0x92,
-  0xd9, 0x6e, 0xf2, 0xad, 0xa7, 0xdb, 0x60, 0xfb,
-  0x59, 0xd3, 0xef, 0xe6, 0xfc, 0x68, 0xe9, 0xfc,
-  0x0d, 0xff, 0x73, 0x7f, 0x3c, 0x74, 0x7c, 0xf8,
-  0xae, 0x53, 0x08, 0xb9, 0x03, 0x92, 0xe3, 0xbc,
-  0x8d, 0xd0, 0x8b, 0x9f, 0xfc, 0xcb, 0xd3, 0xdf,
-  0x7d, 0xd7, 0xf5, 0x3c, 0x74, 0xff, 0xfe, 0xfe,
-  0x3f, 0x94, 0xef, 0xdb, 0xc9, 0x7b, 0x69, 0xcc,
-  0x3a, 0x7f, 0xfd, 0xdf, 0xbf, 0x75, 0xbe, 0x97,
-  0xa0, 0x72, 0xc7, 0x4e, 0x1a, 0x50, 0xf1, 0x01,
-  0xcf, 0xff, 0x6f, 0x14, 0xb2, 0x6e, 0xc1, 0x5e,
-  0xe5, 0x34, 0x40, 0x75, 0x35, 0x12, 0xf0, 0x11,
-  0xcb, 0x77, 0xb9, 0xff, 0xff, 0x7f, 0x9d, 0x9f,
-  0x69, 0xd8, 0xfb, 0xb7, 0xa0, 0x2a, 0x10, 0x84,
-  0xa9, 0xfc, 0x98, 0x2b, 0xdc, 0xa6, 0x88, 0x26,
-  0x7f, 0x92, 0xf8, 0x2b, 0xdc, 0xa6, 0x8b, 0xe6,
-  0x7d, 0xe6, 0xdf, 0xca, 0x6c, 0x7f, 0x4a, 0x75,
-  0x3f, 0xe7, 0xb9, 0xf6, 0xfc, 0xbf, 0xf9, 0xb1,
-  0xd3, 0x82, 0x10, 0x95, 0x3f, 0x5e, 0xd8, 0xbc,
-  0x25, 0x54, 0xbc, 0x87, 0x91, 0x33, 0xf6, 0x09,
-  0xff, 0x9e, 0x62, 0x3f, 0x4f, 0xe3, 0xdb, 0xdc,
-  0x74, 0xff, 0xf6, 0xf7, 0xff, 0xb9, 0x6d, 0xe0,
-  0x01, 0x05, 0xc7, 0x4e, 0x08, 0x42, 0x54, 0xfe,
-  0xde, 0x04, 0xfe, 0x3f, 0x72, 0xaa, 0x5e, 0x4f,
-  0xff, 0xcd, 0xde, 0xe5, 0xb7, 0xb6, 0xdb, 0x03,
-  0xba, 0xf4, 0xc7, 0x8e, 0x97, 0x59, 0x15, 0x7a,
-  0x22, 0x43, 0x95, 0x45, 0xfa, 0x1b, 0x42, 0x48,
-  0xc4, 0x9b, 0xc6, 0x37, 0x3f, 0xec, 0xba, 0x0d,
-  0x2c, 0x9f, 0xb9, 0xe2, 0x08, 0x9f, 0xc9, 0x82,
-  0xbd, 0xca, 0x68, 0x82, 0x2a, 0x79, 0x33, 0xfb,
-  0xfd, 0x61, 0x1f, 0x04, 0xe8, 0x01, 0xfe, 0x7d,
-  0x2e, 0x7f, 0x93, 0xf7, 0xdf, 0x96, 0xe7, 0xce,
-  0x9f, 0xfe, 0xe0, 0xdf, 0x2c, 0x9e, 0xbf, 0xf2,
-  0xde, 0x3a, 0x1c, 0x88, 0x8f, 0x9d, 0x4f, 0xeb,
-  0xef, 0x65, 0x03, 0xcf, 0x9d, 0x3d, 0xe6, 0xbc,
-  0x13, 0xa7, 0xff, 0xda, 0x3d, 0xf4, 0xcb, 0x55,
-  0x2f, 0x96, 0xd0, 0x4e, 0x9f, 0x65, 0xe9, 0xbe,
-  0x9b, 0x1f, 0xce, 0xf2, 0x39, 0xf9, 0x6d, 0xe6,
-  0xff, 0x6b, 0x3a, 0x7e, 0x62, 0x6a, 0xed, 0x8f,
-  0x1d, 0x3f, 0xff, 0xfd, 0xeb, 0xf3, 0x3b, 0xe0,
-  0x77, 0xa9, 0xa3, 0x2d, 0xe4, 0xbd, 0xb4, 0xe6,
-  0x1d, 0x1b, 0x23, 0x8f, 0xc6, 0x5c, 0x63, 0x38,
-  0x77, 0xd0, 0xe9, 0xff, 0x77, 0xd7, 0x05, 0x7b,
-  0x94, 0xd1, 0x08, 0xc2, 0x1f, 0x16, 0x83, 0xb3,
-  0xff, 0x93, 0x1f, 0xdf, 0x7f, 0x7f, 0x47, 0x65,
-  0x0e, 0x9f, 0xfe, 0xee, 0x7b, 0x7e, 0x5b, 0x99,
-  0x50, 0x84, 0x27, 0x4b, 0x36, 0x44, 0xf3, 0x49,
-  0xb3, 0x82, 0x10, 0x95, 0x3f, 0xd8, 0x0e, 0x1c,
-  0x6d, 0x9b, 0x15, 0x52, 0xf2, 0x60, 0x84, 0xa9,
-  0xc1, 0x08, 0x4a, 0x9f, 0xb9, 0xed, 0xac, 0x94,
-  0x2a, 0xa5, 0xe4, 0x7d, 0x16, 0xc1, 0x47, 0x6f,
-  0x32, 0x9f, 0x2f, 0xb6, 0xde, 0xc2, 0xaa, 0x6c,
-  0xe7, 0x04, 0x21, 0x2a, 0x75, 0x10, 0x4a, 0xa9,
-  0x79, 0x20, 0x78, 0xff, 0xee, 0xad, 0x3f, 0x6d,
-  0xf4, 0x77, 0x29, 0xd3, 0xfb, 0x78, 0xed, 0xe6,
-  0xc9, 0xb1, 0xd3, 0xfa, 0xf6, 0xc6, 0xd9, 0x7a,
-  0x1d, 0x02, 0x89, 0x8b, 0x16, 0x7c, 0xe2, 0x11,
-  0x1d, 0xf9, 0x0c, 0x09, 0xcf, 0xea, 0x9d, 0xba,
-  0x9d, 0x3f, 0xfb, 0x35, 0x7d, 0xf0, 0x62, 0xa5,
-  0x91, 0x87, 0x4f, 0xcb, 0xea, 0x5b, 0xcd, 0x15,
-  0x3f, 0xbf, 0x8f, 0xba, 0x9e, 0xd6, 0x74, 0xf7,
-  0x70, 0xeb, 0x3a, 0x37, 0x1e, 0xbb, 0xc6, 0xd3,
-  0xc9, 0xcc, 0x6c, 0x54, 0xe0, 0x84, 0x25, 0x4f,
-  0xff, 0x6f, 0x40, 0x66, 0x7e, 0xf6, 0xf2, 0x7d,
-  0xe2, 0xaa, 0x5e, 0x4b, 0x15, 0x13, 0xcc, 0x3e,
-  0x84, 0x4f, 0x91, 0xc5, 0x6f, 0xa5, 0x7a, 0x10,
-  0xb6, 0x86, 0x1c, 0xff, 0xf9, 0x98, 0xa9, 0xfe,
-  0xbd, 0x36, 0xd3, 0x85, 0xc7, 0x4f, 0x92, 0xf4,
-  0x6d, 0x87, 0x42, 0x1f, 0xe5, 0xd5, 0x27, 0xff,
-  0xbc, 0xdb, 0x3f, 0xb7, 0xf8, 0x39, 0xfe, 0xd6,
-  0x74, 0xff, 0xff, 0x6d, 0x6f, 0x07, 0x35, 0x3c,
-  0xce, 0xbd, 0x34, 0x76, 0x3f, 0x73, 0xa3, 0x11,
-  0x81, 0xca, 0x70, 0x8d, 0x85, 0xdb, 0xc9, 0xae,
-  0x8d, 0x1b, 0x62, 0x9c, 0x96, 0xeb, 0xe8, 0xc6,
-  0xda, 0x85, 0x50, 0x91, 0xb2, 0x15, 0xf6, 0x8c,
-  0x9c, 0x10, 0x92, 0xfc, 0x30, 0x29, 0x2a, 0x76,
-  0xf2, 0x82, 0xb4, 0x86, 0x88, 0x61, 0xc3, 0x39,
-  0xb2, 0x7c, 0xe9, 0xff, 0xec, 0xfd, 0x6f, 0xaf,
-  0xcf, 0xd2, 0xd8, 0x0e, 0x3a, 0x4f, 0xb8, 0xfb,
-  0xf6, 0x1d, 0x9f, 0xac, 0xd7, 0xad, 0xe6, 0x1d,
-  0x3f, 0xef, 0xa5, 0xed, 0xc0, 0xe7, 0xe8, 0x74,
-  0xff, 0xd4, 0xef, 0x0e, 0x3f, 0x50, 0x84, 0x27,
-  0x4f, 0xff, 0x7d, 0x1d, 0xbb, 0x7d, 0xfd, 0xfd,
-  0x1d, 0x94, 0x3a, 0x31, 0x30, 0x65, 0x2f, 0xb1,
-  0xf0, 0x11, 0x27, 0xf2, 0x7d, 0xdf, 0xcc, 0x01,
-  0xd3, 0xf9, 0xd8, 0x34, 0xfa, 0x3c, 0x74, 0xff,
-  0xf2, 0x36, 0x41, 0xae, 0xfb, 0xff, 0x1e, 0xf0,
-  0x9e, 0xef, 0x79, 0xff, 0xec, 0xba, 0x7d, 0x72,
-  0xf6, 0xf0, 0x81, 0x4e, 0x9f, 0x75, 0x33, 0xf7,
-  0x3a, 0x75, 0xfb, 0x56, 0x74, 0xfe, 0xbd, 0xbd,
-  0x50, 0x77, 0x8e, 0x87, 0x93, 0x23, 0xd9, 0x7f,
-  0xe9, 0x97, 0x26, 0xd0, 0x7e, 0x7f, 0xfe, 0xfe,
-  0x53, 0x4d, 0xd9, 0x6e, 0xfe, 0x34, 0xe4, 0x7c,
-  0xe9, 0xff, 0x65, 0x34, 0xc1, 0x5e, 0xe5, 0x34,
-  0x40, 0xd3, 0xec, 0xbd, 0xb9, 0xdb, 0x91, 0x4b,
-  0xf5, 0xe9, 0xff, 0xff, 0xfb, 0x2f, 0x6e, 0xfe,
-  0xbd, 0xd4, 0x1e, 0xeb, 0xb6, 0xcd, 0xb7, 0x63,
-  0x3b, 0xef, 0xb8, 0xf1, 0x05, 0xcf, 0xfb, 0xbb,
-  0x5a, 0xf6, 0xdb, 0xb5, 0x84, 0xf1, 0x05, 0xcf,
-  0xfd, 0x6f, 0x5b, 0xc9, 0xfb, 0xee, 0xd6, 0x13,
-  0xc4, 0x17, 0x3f, 0x93, 0xdf, 0xbe, 0xed, 0x61,
-  0x3c, 0x41, 0x73, 0xf3, 0x33, 0x6d, 0xda, 0xc2,
-  0x78, 0x82, 0xe7, 0xff, 0xfb, 0xbf, 0xff, 0x33,
-  0x75, 0x16, 0xde, 0x1f, 0x6b, 0x7b, 0x02, 0x78,
-  0x82, 0xe6, 0x7f, 0x76, 0xc9, 0xd0, 0xaa, 0x80,
-  0xab, 0x72, 0x27, 0xcf, 0xe2, 0xca, 0xa5, 0xbf,
-  0x28, 0xfa, 0x7b, 0x84, 0x1c, 0x74, 0xff, 0xd6,
-  0xf5, 0xbc, 0x9f, 0xbe, 0xed, 0x61, 0x3c, 0x41,
-  0x73, 0xfc, 0xd5, 0x17, 0xcf, 0x6e, 0xd6, 0x13,
-  0xc4, 0x17, 0x3e, 0xbd, 0x11, 0x9b, 0x95, 0x14,
-  0x5b, 0xd5, 0xa7, 0xff, 0x6e, 0x5b, 0x79, 0x52,
-  0xf4, 0xdd, 0xac, 0x27, 0x88, 0x2e, 0x7f, 0xff,
-  0xef, 0xff, 0xcc, 0xdd, 0xa6, 0x6e, 0xa2, 0xdb,
-  0xc3, 0xed, 0x6f, 0x60, 0x4f, 0x10, 0x5c, 0x62,
-  0x64, 0xcf, 0xa1, 0xf2, 0xe4, 0xff, 0x5b, 0xc3,
-  0xed, 0x6f, 0x60, 0x4f, 0x10, 0x5c, 0xff, 0xf7,
-  0x73, 0xee, 0xa5, 0xbd, 0xb6, 0xc8, 0x28, 0x54,
-  0xff, 0xb1, 0xce, 0xd2, 0x83, 0xf7, 0x9b, 0xcf,
-  0x10, 0x5c, 0x2a, 0x3a, 0x05, 0x22, 0x8a, 0x13,
-  0xfe, 0x5f, 0x0d, 0xf8, 0x14, 0xdc, 0x13, 0xc4,
-  0x17, 0x3f, 0x5b, 0xd6, 0xb7, 0x80, 0x68, 0x02,
-  0xe7, 0xd8, 0x0d, 0xda, 0xc2, 0x78, 0x82, 0xe6,
-  0xcb, 0xa9, 0xf9, 0xd8, 0xee, 0x1f, 0x47, 0x5d,
-  0x21, 0x7f, 0x3f, 0x33, 0x36, 0xdd, 0xac, 0x27,
-  0x88, 0x2e, 0x7f, 0xcb, 0x6f, 0x0f, 0xb5, 0xbd,
-  0x81, 0x3c, 0x41, 0x73, 0x66, 0xee, 0x44, 0x65,
-  0x0f, 0xe7, 0xf6, 0x9e, 0x67, 0x7d, 0xf7, 0x1e,
-  0x20, 0xb9, 0xff, 0x67, 0x9b, 0x67, 0xf3, 0x6e,
-  0x71, 0xe2, 0x0b, 0x61, 0xe1, 0x46, 0xcb, 0xb8,
-  0xe0, 0x2c, 0xfc, 0x7c, 0xf4, 0x8c, 0x62, 0xf1,
-  0x8c, 0xe9, 0x0b, 0x50, 0xb8, 0xcf, 0x81, 0x40,
-  0x01, 0x0d, 0x10, 0x5d, 0x51, 0x01, 0x3f, 0xec,
-  0x75, 0xb9, 0xda, 0x9a, 0x9a, 0x3c, 0x74, 0xfe,
-  0x1f, 0xe6, 0xd6, 0xd0, 0x27, 0x4f, 0x9f, 0xbf,
-  0x08, 0x0e, 0x9f, 0xb1, 0xee, 0xb2, 0x6a, 0xce,
-  0x8f, 0x22, 0x2f, 0x8d, 0x3e, 0x4f, 0x3b, 0x85,
-  0xe3, 0xa6, 0x02, 0x1d, 0x3d, 0xe4, 0x66, 0x1d,
-  0x07, 0x4f, 0xdd, 0xae, 0xe8, 0x20, 0x3a, 0x36,
-  0x36, 0xff, 0x0a, 0x9f, 0xff, 0xc9, 0xed, 0xbe,
-  0x9a, 0x2d, 0xf1, 0x76, 0x45, 0xde, 0xc3, 0xa6,
-  0x02, 0x1d, 0x32, 0x6b, 0x3a, 0x7f, 0xb2, 0xf4,
-  0x46, 0x6f, 0xc6, 0x8e, 0x9f, 0xd4, 0xcb, 0x7a,
-  0x9a, 0x3c, 0x74, 0xc1, 0x09, 0x53, 0xfd, 0xfc,
-  0x6d, 0xce, 0xa7, 0xb6, 0x3a, 0x15, 0x3f, 0x7f,
-  0x0d, 0x88, 0xab, 0x15, 0xec, 0x44, 0x06, 0x26,
-  0xec, 0x57, 0xe2, 0xf4, 0x3a, 0x09, 0xae, 0xf1,
-  0x69, 0xc1, 0x08, 0x4a, 0x93, 0x0a, 0xa9, 0x79,
-  0x3e, 0xe6, 0xbb, 0x84, 0xaa, 0xa3, 0x67, 0x7c,
-  0x2e, 0xa7, 0xf3, 0xf7, 0x4c, 0xb6, 0x3c, 0x74,
-  0x23, 0x63, 0x2f, 0x91, 0x98, 0x6b, 0x3c, 0x7c,
-  0xc7, 0xd1, 0xaa, 0xda, 0x1e, 0x7d, 0x49, 0x1e,
-  0xfa, 0x35, 0x21, 0xa3, 0xa4, 0xaf, 0xf6, 0xc9,
-  0x73, 0xd8, 0xa9, 0x73, 0xa7, 0xb1, 0x99, 0x73,
-  0xa7, 0xb9, 0xed, 0xee, 0x3a, 0x10, 0xf8, 0xdf,
-  0x1f, 0xd4, 0x20, 0x9f, 0xbf, 0xa6, 0xcc, 0xe7,
-  0x1d, 0x3f, 0xfc, 0xfb, 0xbe, 0x9b, 0x99, 0xf4,
-  0xd7, 0x7f, 0x3c, 0x74, 0x22, 0x21, 0x7c, 0x5f,
-  0x3b, 0xb7, 0x6f, 0x3a, 0x7f, 0xfb, 0xee, 0xdd,
-  0x9b, 0x7a, 0x8f, 0xdf, 0x4e, 0xa1, 0xd1, 0xb8,
-  0xfd, 0x30, 0x7e, 0x7e, 0x79, 0xa7, 0x37, 0x05,
-  0xe3, 0xa6, 0x73, 0xc7, 0x4f, 0xad, 0x9e, 0x75,
-  0x0e, 0x9f, 0xfe, 0xb2, 0x6f, 0xad, 0xff, 0xc0,
-  0xa5, 0x10, 0x05, 0x4f, 0xe0, 0x60, 0xaf, 0x72,
-  0x9e, 0x20, 0x48, 0x72, 0x2c, 0xf6, 0x27, 0x15,
-  0x19, 0xeb, 0xbd, 0xdf, 0x3a, 0x79, 0xfa, 0x75,
-  0xce, 0x8c, 0x3c, 0x4b, 0x11, 0x4f, 0xef, 0xf0,
-  0x69, 0x44, 0x01, 0xd3, 0x82, 0x10, 0x9f, 0x0f,
-  0xa9, 0xdd, 0xfd, 0x8b, 0x87, 0xd5, 0x4d, 0x4c,
-  0x6c, 0x89, 0x40, 0x2d, 0xcf, 0xff, 0xb3, 0xfe,
-  0xd7, 0x5a, 0x5e, 0xda, 0x73, 0x9c, 0x87, 0x43,
-  0xc7, 0xf9, 0xac, 0x92, 0x35, 0x42, 0xac, 0x87,
-  0x1a, 0x64, 0x32, 0xbc, 0xe9, 0xd1, 0x98, 0xcf,
-  0xbd, 0x74, 0xbd, 0x0a, 0x9e, 0x54, 0xbd, 0x0a,
-  0x98, 0x21, 0x2a, 0x1c, 0x7b, 0xb8, 0x4e, 0x12,
-  0x09, 0xb0, 0x25, 0x54, 0xd7, 0x4f, 0xff, 0xb2,
-  0xe8, 0xb9, 0x9f, 0xbd, 0xbc, 0x9f, 0x78, 0xe8,
-  0x01, 0xfc, 0x04, 0x96, 0x7f, 0xff, 0x23, 0x6f,
-  0x7c, 0x1b, 0xaf, 0x4c, 0x5b, 0x77, 0xef, 0x43,
-  0xa7, 0xf3, 0x4f, 0xba, 0xda, 0x20, 0x9d, 0x39,
-  0xdc, 0x27, 0x4f, 0x9d, 0x97, 0xcd, 0x8a, 0x97,
-  0x9a, 0x3c, 0x1b, 0x8d, 0x4c, 0x04, 0x3a, 0x60,
-  0x21, 0xd3, 0xf7, 0xf4, 0x76, 0x7e, 0xbe, 0x35,
-  0x40, 0x15, 0x9f, 0xfa, 0xf6, 0xc6, 0x6f, 0x40,
-  0x63, 0xf7, 0x3a, 0x7f, 0x3e, 0xbe, 0x1d, 0xe9,
-  0xb1, 0xd3, 0xc0, 0x67, 0x3a, 0x87, 0xf7, 0x74,
-  0x69, 0xcd, 0xf8, 0xf9, 0xd0, 0x87, 0xb1, 0xc7,
-  0x33, 0x82, 0x10, 0x95, 0x3f, 0x26, 0x6b, 0xfe,
-  0x94, 0x2a, 0xa5, 0xe4, 0xf0, 0x7b, 0xee, 0x3a,
-  0x65, 0xb1, 0xd3, 0x82, 0x10, 0x95, 0x3f, 0x7b,
-  0xb5, 0xdb, 0xd7, 0x2a, 0xa5, 0xe4, 0xfb, 0x01,
-  0x98, 0xd1, 0xd2, 0xa6, 0xe4, 0x4a, 0x89, 0x8f,
-  0xcf, 0xa7, 0xbd, 0xfd, 0x1d, 0xb2, 0x3b, 0x72,
-  0x16, 0xd0, 0x8b, 0x81, 0xee, 0x22, 0xc6, 0x4d,
-  0x6e, 0xc2, 0xa7, 0x68, 0xc6, 0x28, 0x79, 0x78,
-  0xca, 0xe7, 0xe4, 0x60, 0x8f, 0x5c, 0xe9, 0xff,
-  0xef, 0x31, 0xf7, 0x53, 0x76, 0x7f, 0xf9, 0xe0,
-  0x1d, 0x16, 0x3f, 0xdb, 0x95, 0x4a, 0xad, 0xd1,
-  0xfd, 0xe6, 0x52, 0x53, 0x93, 0xd1, 0x88, 0xba,
-  0x52, 0x6e, 0xd2, 0x96, 0x32, 0xb5, 0xeb, 0xd7,
-  0x19, 0xaa, 0xc7, 0x4a, 0xfc, 0xa6, 0xcf, 0x42,
-  0x75, 0xa8, 0xf3, 0x86, 0x73, 0x25, 0x91, 0xb9,
-  0xda, 0x76, 0xa7, 0xa9, 0xcb, 0x00, 0x95, 0x7f,
-  0xf9, 0xcb, 0xfa, 0x56, 0x20, 0x97, 0xac, 0xca,
-  0xb4, 0x8c, 0xa5, 0xb4, 0x2d, 0xc3, 0x09, 0x66,
-  0xf9, 0x5d, 0x7b, 0xe7, 0x5b, 0x75, 0x21, 0xf9,
-  0x15, 0x7f, 0x9f, 0xb7, 0x5f, 0xbf, 0x2c, 0xfe,
-  0xae, 0x0a, 0xf7, 0x29, 0xa2, 0xe3, 0x9f, 0xd5,
-  0xc1, 0x5e, 0xe5, 0x34, 0x5d, 0x73, 0xff, 0x57,
-  0x9d, 0x5c, 0x15, 0xee, 0x53, 0x44, 0xa3, 0x08,
-  0xff, 0xa9, 0xce, 0x28, 0xd8, 0xef, 0x59, 0xda,
-  0x9d, 0xfa, 0x1e, 0x1a, 0xb4, 0x0e, 0xbf, 0xa4,
-  0xda, 0x1b, 0x5c, 0xef, 0x50, 0xee, 0x7f, 0xf5,
-  0x59, 0xce, 0xae, 0x0a, 0xf7, 0x29, 0xa2, 0x5a,
-  0x9f, 0x0a, 0xf7, 0x29, 0xa2, 0x37, 0x9f, 0xf7,
-  0x3a, 0xb8, 0x2b, 0xdc, 0xa6, 0x89, 0x7e, 0x55,
-  0xc3, 0xf6, 0x61, 0x84, 0xfe, 0xae, 0x0a, 0xf7,
-  0x29, 0xa2, 0xab, 0x9f, 0xed, 0x79, 0xfc, 0x7e,
-  0xfc, 0xc3, 0xa6, 0xdb, 0xc7, 0x4f, 0xd8, 0x2b,
-  0xdc, 0xa6, 0x89, 0x02, 0x37, 0x1e, 0x65, 0x45,
-  0xe7, 0xd4, 0xef, 0xf3, 0xe7, 0x43, 0x8f, 0x2d,
-  0xf2, 0x48, 0xd6, 0x8f, 0x4e, 0x86, 0x8c, 0xff,
-  0xdf, 0xc7, 0xaa, 0xde, 0x9f, 0xfe, 0x5c, 0xe8,
-  0xa9, 0xf8, 0x09, 0x4c, 0xfe, 0xae, 0x0a, 0xf7,
-  0x29, 0xa2, 0xc8, 0x9f, 0xd5, 0xc1, 0x5e, 0xe5,
-  0x34, 0x5a, 0xf3, 0xfa, 0xb8, 0x2b, 0xdc, 0xa6,
-  0x8b, 0x92, 0x7c, 0x2b, 0xdc, 0xa6, 0x8b, 0xb2,
-  0x7f, 0xdc, 0xea, 0xe0, 0xaf, 0x72, 0x9a, 0x28,
-  0xe9, 0x57, 0x0f, 0xd9, 0x86, 0x13, 0xe1, 0x5e,
-  0xe5, 0x34, 0x52, 0xb3, 0xff, 0xff, 0xd6, 0x47,
-  0x92, 0xde, 0x6d, 0xdb, 0x5b, 0xd5, 0x5b, 0x79,
-  0xab, 0x23, 0xd8, 0x74, 0xfa, 0xac, 0xe7, 0x57,
-  0x11, 0x64, 0xd1, 0x84, 0x3c, 0xb9, 0xde, 0xe8,
-  0x64, 0x3e, 0x4f, 0xe8, 0xe7, 0xd8, 0x42, 0x03,
-  0xba, 0x1d, 0xde, 0x16, 0x2d, 0xa1, 0xb3, 0x3f,
-  0xce, 0xae, 0x0a, 0xf7, 0x29, 0xa2, 0x38, 0x9f,
-  0xef, 0x57, 0x05, 0x7b, 0x94, 0xd1, 0x5a, 0xca,
-  0xbc, 0x88, 0x2b, 0xa0, 0xcf, 0xfe, 0xab, 0x39,
-  0xd5, 0xc1, 0x5e, 0xe5, 0x34, 0x4b, 0x73, 0x63,
-  0xe7, 0x4f, 0xed, 0xb1, 0x8c, 0x4f, 0x50, 0xe8,
-  0x7c, 0xf2, 0x7c, 0x2d, 0x3a, 0xdb, 0x38, 0xe9,
-  0xce, 0x62, 0x9d, 0x06, 0x88, 0x6e, 0x7f, 0xdc,
-  0xea, 0xe0, 0xaf, 0x72, 0x9a, 0x26, 0x09, 0xc3,
-  0xa0, 0x0a, 0x9f, 0xdf, 0xcb, 0xdd, 0x06, 0x87,
-  0x4a, 0xa8, 0x98, 0x2b, 0xc4, 0x7b, 0x0e, 0xa8,
-  0xdb, 0x05, 0xee, 0x8d, 0xbc, 0x72, 0x73, 0x34,
-  0x12, 0xa7, 0xfd, 0xce, 0xae, 0x0a, 0xf7, 0x29,
-  0xa2, 0x63, 0x95, 0x7c, 0x7c, 0x4c, 0x1c, 0x9f,
-  0x92, 0x9b, 0xaf, 0x96, 0x3a, 0x7f, 0xff, 0xf9,
-  0xd4, 0xb6, 0x68, 0x1a, 0x5b, 0x17, 0x29, 0xbb,
-  0x1f, 0x75, 0x3d, 0xff, 0x1d, 0x3c, 0xbd, 0xca,
-  0x68, 0xac, 0x67, 0xfc, 0xdf, 0x97, 0xfe, 0x68,
-  0x9f, 0xb9, 0xd1, 0xad, 0x31, 0xb7, 0xcb, 0x86,
-  0x10, 0x37, 0x2b, 0x9f, 0xfc, 0x9f, 0xbe, 0xbd,
-  0x13, 0xf8, 0xa8, 0x27, 0x4f, 0xfb, 0x36, 0xb6,
-  0x51, 0xf7, 0x25, 0x8e, 0x9f, 0xff, 0xfb, 0xfa,
-  0x3d, 0x8b, 0xbb, 0xfa, 0x6a, 0x6e, 0xc7, 0xdd,
-  0x9a, 0x7c, 0x14, 0x3a, 0x7f, 0x6a, 0x87, 0x9a,
-  0x73, 0x70, 0x5e, 0x3a, 0x75, 0xbd, 0x5c, 0x4e,
-  0x2d, 0x51, 0x6c, 0x93, 0x73, 0xf6, 0xf7, 0xe9,
-  0xb4, 0x68, 0xe9, 0xf7, 0x7d, 0xed, 0x28, 0x74,
-  0x7c, 0xf0, 0x68, 0x31, 0x3e, 0x0d, 0x28, 0x80,
-  0x3a, 0x7c, 0x8e, 0x06, 0x8e, 0x3a, 0x72, 0x7d,
-  0xc7, 0x43, 0x47, 0x87, 0x72, 0x89, 0xf9, 0x19,
-  0x9f, 0xf6, 0xb3, 0xa5, 0x43, 0xa3, 0xc6, 0xfb,
-  0x8b, 0xa6, 0x02, 0x15, 0x30, 0x42, 0x54, 0x78,
-  0xd5, 0x84, 0x56, 0x7f, 0x73, 0xbf, 0x97, 0xb7,
-  0x8a, 0xa9, 0xa1, 0x9e, 0xdb, 0x9f, 0xa1, 0xd3,
-  0x93, 0xed, 0x1d, 0x37, 0xd0, 0xe8, 0x68, 0xd8,
-  0x88, 0xe4, 0xf0, 0x83, 0x35, 0x0e, 0x9d, 0xbc,
-  0x75, 0x9d, 0x08, 0x8b, 0x7c, 0x54, 0xf1, 0x0d,
-  0x88, 0xe6, 0xb5, 0xce, 0x9c, 0x10, 0x84, 0xa9,
-  0xff, 0xb1, 0x76, 0x47, 0xb7, 0xe5, 0xb9, 0xf2,
-  0xaa, 0x5e, 0x48, 0x4e, 0x9f, 0x33, 0xd7, 0x07,
-  0x1d, 0x1a, 0xb3, 0x6d, 0xa0, 0x7c, 0xfe, 0x5f,
-  0x53, 0xf8, 0xdb, 0x8e, 0x9b, 0x2e, 0x74, 0x3e,
-  0x79, 0x16, 0x33, 0x9f, 0xfe, 0xbf, 0xa9, 0x6c,
-  0xdb, 0xf8, 0xdb, 0xf9, 0x43, 0xa5, 0x54, 0x5c,
-  0x2d, 0xd8, 0x8b, 0x1a, 0x85, 0x85, 0x8d, 0x96,
-  0x87, 0xcf, 0x1d, 0xfc, 0xca, 0x90, 0x8b, 0xbb,
-  0x76, 0xf2, 0x39, 0xf0, 0xaf, 0x72, 0x9a, 0x2b,
-  0x79, 0xff, 0x73, 0xab, 0x82, 0xbd, 0xca, 0x68,
-  0x9c, 0x25, 0x5c, 0x3f, 0x66, 0x18, 0x4f, 0x85,
-  0x7b, 0x94, 0xd1, 0x68, 0xcf, 0x63, 0x5e, 0xd6,
-  0x74, 0xab, 0x87, 0xa9, 0x63, 0x09, 0xe5, 0xee,
-  0x53, 0x45, 0xb5, 0x3f, 0x59, 0x18, 0x9e, 0xd8,
-  0xe9, 0xab, 0x82, 0x7b, 0x17, 0x2b, 0x9f, 0xd5,
-  0xc1, 0x5e, 0xe5, 0x34, 0x5c, 0xb3, 0xfa, 0xb8,
-  0x2b, 0xdc, 0xa6, 0x8b, 0xb6, 0x11, 0x99, 0xda,
-  0xf1, 0x43, 0xa3, 0xa0, 0xda, 0x19, 0xfa, 0xe5,
-  0x67, 0x7a, 0x73, 0x33, 0x57, 0x19, 0x05, 0x9e,
-  0xfe, 0xff, 0x42, 0xcb, 0x9d, 0xcf, 0xea, 0xe0,
-  0xaf, 0x72, 0x9a, 0x2a, 0x79, 0xe5, 0xee, 0x53,
-  0x45, 0x73, 0x3f, 0xab, 0x82, 0xbd, 0xca, 0x68,
-  0xb3, 0xa0, 0x4f, 0x9a, 0xc5, 0x73, 0xe1, 0x5e,
-  0xe5, 0x34, 0x48, 0x53, 0xfd, 0xe7, 0xe9, 0x7f,
-  0xa3, 0x28, 0x74, 0xce, 0xae, 0x1f, 0x50, 0x0c,
-  0x27, 0x9b, 0xa5, 0x91, 0x87, 0x4f, 0xec, 0xb5,
-  0x29, 0x82, 0xf1, 0xd2, 0xae, 0x26, 0x23, 0xd0,
-  0x8b, 0xa1, 0x6d, 0xc9, 0xe7, 0xff, 0x55, 0x9c,
-  0xea, 0xe0, 0xaf, 0x72, 0x9a, 0x27, 0xc8, 0x55,
-  0x49, 0x7a, 0xb8, 0xec, 0xac, 0x8f, 0x3e, 0x15,
-  0xee, 0x53, 0x45, 0x65, 0x3f, 0xee, 0x75, 0x70,
-  0x57, 0xb9, 0x4d, 0x13, 0x74, 0xde, 0xae, 0x1f,
-  0xb3, 0x0c, 0x27, 0xc2, 0xbd, 0xca, 0x68, 0x95,
-  0xa7, 0xfb, 0x5d, 0xbd, 0xbb, 0x45, 0xca, 0x1d,
-  0x3e, 0xab, 0x39, 0xd5, 0xc3, 0xed, 0xe3, 0x09,
-  0xf0, 0xaf, 0x72, 0x9a, 0x25, 0xc9, 0xe6, 0xde,
-  0xfa, 0x1d, 0x3e, 0xab, 0x39, 0xd5, 0xc3, 0xd3,
-  0xe3, 0x09, 0xff, 0xab, 0xce, 0xae, 0x0a, 0xf7,
-  0x29, 0xa2, 0x3b, 0x9f, 0xeb, 0xdb, 0x1d, 0x5e,
-  0xfd, 0x0e, 0x9f, 0x9b, 0x9f, 0x45, 0xcf, 0x9d,
-  0x3f, 0x6a, 0xbf, 0xcb, 0x75, 0xce, 0x9f, 0x0a,
-  0xf7, 0x29, 0xa2, 0xa1, 0x9f, 0x65, 0xaf, 0x8f,
-  0x1d, 0x2a, 0xea, 0xa8, 0xb7, 0x6e, 0x17, 0xe1,
-  0x8d, 0xcc, 0x27, 0xc2, 0xbd, 0xca, 0x68, 0xaa,
-  0x27, 0xfd, 0xce, 0xae, 0x0a, 0xf7, 0x29, 0xa2,
-  0x6b, 0x95, 0x70, 0xfd, 0x98, 0x61, 0x3f, 0xab,
-  0x82, 0xbd, 0xca, 0x68, 0xab, 0x27, 0xfe, 0xaf,
-  0x3a, 0xb8, 0x2b, 0xdc, 0xa6, 0x89, 0x12, 0x7c,
-  0x2b, 0xdc, 0xa6, 0x8b, 0x4a, 0x7f, 0xdc, 0xea,
-  0xe0, 0xaf, 0x72, 0x9a, 0x27, 0xd9, 0x57, 0x0f,
-  0xd9, 0x86, 0x13, 0xff, 0xaa, 0xce, 0x75, 0x70,
-  0x57, 0xb9, 0x4d, 0x14, 0x24, 0xfa, 0xde, 0x79,
-  0x04, 0xe9, 0xf0, 0xaf, 0x72, 0x9a, 0x28, 0xf9,
-  0xff, 0xfb, 0x36, 0xb2, 0x6f, 0xad, 0xff, 0xc0,
-  0xa5, 0x10, 0x05, 0x4f, 0xaa, 0xce, 0x75, 0x51,
-  0x16, 0x98, 0x4e, 0xde, 0x61, 0x08, 0xba, 0xd0,
-  0xf4, 0x24, 0x1c, 0x7b, 0x89, 0x9a, 0xe1, 0xde,
-  0xb0, 0xc1, 0x7c, 0x9d, 0xa3, 0xbb, 0x43, 0x08,
-  0x04, 0xf7, 0x8c, 0x1a, 0x7f, 0x57, 0x05, 0x7b,
-  0x94, 0xd1, 0x11, 0x4f, 0xd8, 0x2b, 0xdc, 0xa6,
-  0x88, 0xae, 0x7f, 0xb5, 0x75, 0xc1, 0x5e, 0xe5,
-  0x34, 0x57, 0x11, 0x53, 0xfa, 0xe3, 0x59, 0xec,
-  0xb7, 0x5c, 0xe9, 0xfd, 0x9e, 0x10, 0x03, 0x4a,
-  0x1d, 0x2d, 0x57, 0xe7, 0xa7, 0x42, 0x09, 0xff,
-  0xbb, 0xce, 0xf7, 0xef, 0xa5, 0x87, 0x0e, 0x9f,
-  0x67, 0xb6, 0x1c, 0x3a, 0x75, 0xe9, 0xeb, 0x1f,
-  0x55, 0xd1, 0x27, 0xc2, 0xbd, 0xca, 0x68, 0xa7,
-  0xa1, 0xb8, 0x8f, 0xb4, 0x84, 0xbe, 0x1a, 0x4f,
-  0xfe, 0xe7, 0x57, 0x6f, 0xf0, 0x69, 0x44, 0x01,
-  0xd1, 0x54, 0x40, 0xec, 0x6f, 0x3a, 0xbb, 0x61,
-  0xd3, 0xe4, 0x70, 0x34, 0x71, 0xd3, 0xcb, 0xdc,
-  0xa6, 0x8a, 0xce, 0x1a, 0x3d, 0x31, 0x28, 0x9f,
-  0x9e, 0x62, 0x7d, 0xd4, 0x3a, 0x72, 0x3d, 0xe3,
-  0xa7, 0xd7, 0x06, 0xff, 0xb8, 0xe9, 0xf6, 0x34,
-  0xf6, 0x80, 0x3a, 0x55, 0xc4, 0x60, 0x09, 0x15,
-  0x8b, 0xb8, 0x73, 0x79, 0x54, 0xff, 0xd5, 0xe7,
-  0x57, 0x05, 0x7b, 0x94, 0xd1, 0x22, 0xcf, 0xea,
-  0xe0, 0xaf, 0x72, 0x9a, 0x2c, 0x99, 0xfd, 0x5c,
-  0x15, 0xee, 0x53, 0x45, 0xb1, 0x3b, 0x29, 0x87,
-  0x4f, 0x85, 0x7b, 0x94, 0xd1, 0x6d, 0xca, 0xae,
-  0x3c, 0xac, 0x1a, 0x9f, 0xf3, 0x71, 0xb9, 0xaa,
-  0x57, 0xb6, 0x7d, 0x00, 0x74, 0xfc, 0x9f, 0x76,
-  0xda, 0x30, 0xe9, 0xf0, 0xaf, 0x72, 0x9a, 0x2f,
-  0x09, 0xeb, 0xb7, 0xe5, 0x8e, 0x9f, 0x67, 0xc1,
-  0xa8, 0x87, 0x4f, 0x93, 0x7e, 0x9d, 0x43, 0xa7,
-  0x5d, 0x00, 0x74, 0xab, 0xaa, 0x6a, 0x67, 0xaf,
-  0x26, 0xe1, 0x7b, 0xe6, 0x00, 0x24, 0xf9, 0x4d,
-  0xca, 0x67, 0x7b, 0x1f, 0x3a, 0x7c, 0x2b, 0xdc,
-  0xa6, 0x8b, 0xd2, 0x7f, 0xdf, 0xeb, 0xb9, 0x35,
-  0xdf, 0xcf, 0x1d, 0x3e, 0xc6, 0x5b, 0xb6, 0x3a,
-  0x55, 0xd9, 0x16, 0x98, 0x39, 0xbc, 0xc3, 0x51,
-  0x06, 0x11, 0x90, 0x50, 0xf4, 0x2d, 0x72, 0x3f,
-  0x05, 0x24, 0xf4, 0x65, 0xe2, 0x9e, 0xc4, 0xc0,
-  0x1d, 0xfe, 0x10, 0xba, 0x46, 0xc8, 0x18, 0xca,
-  0x67, 0xb2, 0xdd, 0x73, 0xa7, 0xf6, 0x78, 0x40,
-  0x0d, 0x28, 0x74, 0xb5, 0x5f, 0x9e, 0x9d, 0x08,
-  0x27, 0xc2, 0xbd, 0xca, 0x68, 0x88, 0xe7, 0xff,
-  0xad, 0xa5, 0x29, 0x8c, 0xfe, 0x36, 0xdc, 0x8d,
-  0xd4, 0xe9, 0xff, 0x39, 0x1e, 0x1c, 0xbd, 0xfd,
-  0x73, 0xa7, 0xff, 0xf9, 0x2d, 0xde, 0xba, 0x5b,
-  0xf9, 0x7b, 0x7a, 0xd9, 0xe0, 0x9d, 0x33, 0xcc,
-  0x2a, 0x60, 0x84, 0xa9, 0xff, 0x9d, 0x55, 0xb7,
-  0x9a, 0xb2, 0x3d, 0x50, 0x1a, 0xd0, 0x8b, 0xcf,
-  0xec, 0xd5, 0xff, 0x2d, 0xd7, 0x3a, 0x7f, 0xfe,
-  0x5a, 0x8f, 0x7f, 0xd7, 0xa8, 0xa5, 0xff, 0xc0,
-  0x3a, 0x1b, 0x8a, 0x9c, 0x70, 0xb5, 0x4c, 0x1f,
-  0x5a, 0x13, 0xee, 0x84, 0x95, 0xd7, 0x5b, 0x1a,
-  0xcf, 0x85, 0x7b, 0x94, 0xd1, 0x17, 0x4f, 0xae,
-  0x0d, 0xff, 0x71, 0x6c, 0xf6, 0x95, 0x70, 0xf9,
-  0xf8, 0xc2, 0x2a, 0x98, 0x43, 0xa1, 0xc5, 0x3f,
-  0xf3, 0x39, 0xd5, 0xc1, 0x5e, 0xe5, 0x34, 0x4c,
-  0xd3, 0x9f, 0x4a, 0x1d, 0x39, 0x7c, 0xc3, 0xa7,
-  0xcb, 0xd6, 0xf3, 0x47, 0x4f, 0xfd, 0xa9, 0xeb,
-  0xf9, 0x7d, 0xb5, 0xf1, 0x4e, 0x9f, 0xff, 0xed,
-  0x3b, 0xeb, 0xfc, 0xda, 0xda, 0x6e, 0xb2, 0x38,
-  0x51, 0xe3, 0xa3, 0x11, 0x63, 0x64, 0x79, 0xff,
-  0xf6, 0xde, 0xfb, 0xd9, 0x4f, 0x75, 0xaa, 0x10,
-  0x84, 0xa9, 0xe5, 0xee, 0x53, 0x45, 0x9f, 0x3f,
-  0xfd, 0xe1, 0xb7, 0x6e, 0xc6, 0xdf, 0xca, 0x67,
-  0xce, 0x9c, 0x10, 0x84, 0xa9, 0xff, 0x73, 0xa9,
-  0xfc, 0x5d, 0xb0, 0x4a, 0xa9, 0x79, 0x3f, 0xc9,
-  0x6f, 0x6d, 0xfe, 0xe6, 0x8e, 0x9f, 0xef, 0x7f,
-  0x6d, 0xfb, 0x69, 0x7a, 0x1d, 0x0a, 0x9d, 0x98,
-  0xac, 0x58, 0xac, 0x0d, 0xb7, 0x4b, 0x6c, 0x73,
-  0x3f, 0xff, 0xff, 0x66, 0x02, 0x99, 0x9f, 0xd7,
-  0xbc, 0x7e, 0x99, 0x6a, 0xd3, 0xf8, 0xf3, 0x31,
-  0x87, 0x4e, 0xa2, 0x3c, 0x74, 0xe6, 0xfc, 0xb1,
-  0xd0, 0xe4, 0x62, 0x52, 0x11, 0x57, 0x1c, 0x9e,
-  0x7c, 0x1a, 0x29, 0xd3, 0xeb, 0x7d, 0x30, 0x4c,
-  0x9f, 0xf7, 0x85, 0xd8, 0x2f, 0x69, 0xdb, 0x1a,
-  0x20, 0xda, 0x9a, 0x59, 0xf7, 0x2f, 0x98, 0x87,
-  0x4f, 0xce, 0xb7, 0xf9, 0xfb, 0x9d, 0x2c, 0x53,
-  0xd3, 0xf9, 0x2c, 0xff, 0xff, 0xb8, 0x37, 0xcb,
-  0x5d, 0x33, 0xef, 0xdf, 0x07, 0xcf, 0x73, 0x0e,
-  0x87, 0x26, 0x81, 0x90, 0xaf, 0xf9, 0x34, 0xfc,
-  0x39, 0xb5, 0x2c, 0x87, 0x4f, 0xff, 0xed, 0x3f,
-  0xda, 0xf7, 0x6f, 0xff, 0x5e, 0x9e, 0x7e, 0xde,
-  0x09, 0xd3, 0xff, 0xfd, 0x4a, 0x20, 0xdd, 0x2a,
-  0xcc, 0xbd, 0x37, 0xd3, 0x9d, 0x87, 0x4f, 0x5b,
-  0x3c, 0xd8, 0xe8, 0xf2, 0x22, 0x6c, 0xcd, 0x33,
-  0x35, 0x53, 0x45, 0xf9, 0x3f, 0xf3, 0xaf, 0xa3,
-  0x9c, 0xcb, 0xdd, 0x18, 0x74, 0xff, 0xde, 0xcf,
-  0xe6, 0x53, 0x73, 0xa8, 0xc3, 0xa1, 0xf4, 0x45,
-  0xd1, 0x1a, 0x7b, 0xff, 0x45, 0x3a, 0x11, 0x31,
-  0xad, 0x88, 0xf2, 0x16, 0x7c, 0x49, 0x3f, 0xff,
-  0xf6, 0xa2, 0x5b, 0xcc, 0xab, 0x4e, 0xe1, 0xdf,
-  0x6f, 0x3f, 0x45, 0xf3, 0xc7, 0x4f, 0xb4, 0xca,
-  0x7b, 0xe7, 0x4f, 0x93, 0x7e, 0x9d, 0x43, 0xa6,
-  0x6e, 0xd8, 0x74, 0xff, 0xff, 0xad, 0xe7, 0xef,
-  0x8f, 0xdc, 0x45, 0x2e, 0x0d, 0xff, 0x75, 0xb0,
-  0xe9, 0xc1, 0x08, 0x4a, 0x9e, 0xdb, 0x6e, 0xf9,
-  0x55, 0x2f, 0x21, 0x11, 0xb0, 0xa3, 0x7e, 0x84,
-  0x5c, 0xff, 0xd9, 0xf7, 0xef, 0x83, 0xe7, 0xb9,
-  0x87, 0x4f, 0xb2, 0xee, 0x65, 0x8e, 0x84, 0x3e,
-  0xba, 0x22, 0x4c, 0x0b, 0x1d, 0x3f, 0x3c, 0xd3,
-  0x9b, 0x82, 0xf1, 0xd3, 0xfb, 0x5d, 0xb2, 0xf6,
-  0xf5, 0xce, 0x9b, 0xc2, 0x74, 0x6a, 0x83, 0xfe,
-  0xf1, 0xa5, 0x8d, 0x67, 0xff, 0x6d, 0xb2, 0x6c,
-  0x29, 0x7f, 0x2f, 0xb6, 0x3a, 0x55, 0x6e, 0x8c,
-  0xbe, 0x3d, 0x52, 0x1c, 0x78, 0x6f, 0x68, 0x6c,
-  0x64, 0x7a, 0xaf, 0xc6, 0x39, 0xe3, 0x56, 0xa3,
-  0x88, 0x13, 0x56, 0x16, 0x5a, 0x50, 0x6f, 0x20,
-  0x81, 0xeb, 0xe5, 0x14, 0x8c, 0x06, 0xf0, 0x9e,
-  0x09, 0x0b, 0x7c, 0x25, 0x37, 0x9a, 0xc5, 0x59,
-  0xaf, 0x56, 0xa6, 0x17, 0xcf, 0xfe, 0xab, 0x39,
-  0xd5, 0xc1, 0x5e, 0xe5, 0x34, 0x4d, 0x93, 0xfa,
-  0xb8, 0x2b, 0xdc, 0xa6, 0x8a, 0xb6, 0x7f, 0x39,
-  0xda, 0x5f, 0xe8, 0xe3, 0xa7, 0xb2, 0xdd, 0x73,
-  0xa5, 0xaa, 0xe1, 0xea, 0x7c, 0xd2, 0x7c, 0x2b,
-  0xdc, 0xa6, 0x8a, 0xd2, 0x7f, 0xf9, 0x50, 0x70,
-  0x1c, 0xce, 0x72, 0x79, 0x4e, 0x9f, 0xfe, 0x75,
-  0x33, 0xe8, 0xce, 0xcb, 0xdd, 0x18, 0x74, 0xd7,
-  0xba, 0x22, 0x5f, 0x92, 0xa7, 0xf2, 0x36, 0xdf,
-  0x7f, 0xa0, 0x0e, 0x9f, 0x9e, 0xcb, 0x7b, 0x18,
-  0x74, 0xff, 0x66, 0xa7, 0xd0, 0x2f, 0xba, 0x87,
-  0x4f, 0xe7, 0x65, 0xfb, 0xe0, 0xd0, 0xe9, 0x55,
-  0xb8, 0x9f, 0x96, 0x16, 0x7a, 0x18, 0xf6, 0x2d,
-  0xe3, 0x6f, 0x96, 0xdc, 0xf2, 0x7f, 0x57, 0x05,
-  0x7b, 0x94, 0xd1, 0x60, 0x4f, 0x85, 0x7b, 0x94,
-  0xd1, 0x3a, 0xcf, 0xff, 0xeb, 0x23, 0xdb, 0x63,
-  0x2b, 0x4a, 0x65, 0xbd, 0x4d, 0x1e, 0x3a, 0x7d,
-  0x56, 0x73, 0xab, 0x88, 0x95, 0x68, 0xc2, 0x7c,
-  0x2b, 0xdc, 0xa6, 0x8b, 0x66, 0x7f, 0xc0, 0x4a,
-  0x56, 0xde, 0x5e, 0x13, 0xa5, 0x5c, 0x3e, 0xce,
-  0x30, 0x9e, 0x5e, 0xe5, 0x34, 0x5c, 0xd2, 0x61,
-  0xd3, 0x57, 0x04, 0xdd, 0x84, 0xae, 0x7f, 0x57,
-  0x05, 0x7b, 0x94, 0xd1, 0x77, 0xcf, 0x57, 0x5e,
-  0xc0, 0x3a, 0x11, 0xb3, 0x80, 0xca, 0x6d, 0x1a,
-  0x98, 0x3e, 0xa5, 0xe9, 0x50, 0x22, 0xe4, 0xc8,
-  0x68, 0x02, 0x15, 0x94, 0x61, 0xb9, 0x5e, 0xf3,
-  0xb9, 0xfd, 0xf7, 0xb3, 0x52, 0xe9, 0xac, 0xe9,
-  0xf0, 0xaf, 0x72, 0x9a, 0x25, 0x79, 0xed, 0x38,
-  0x5c, 0x74, 0xff, 0xfe, 0xf5, 0xf9, 0x9d, 0xf0,
-  0x58, 0x3d, 0xf7, 0x97, 0xcf, 0x1d, 0x2b, 0x6c,
-  0x88, 0x3e, 0x21, 0x9d, 0xce, 0xaa, 0x26, 0x29,
-  0x87, 0x14, 0x85, 0x9c, 0xeb, 0xa6, 0xc5, 0x4f,
-  0xfe, 0xb7, 0x7a, 0xe8, 0xef, 0x0b, 0xda, 0x00,
-  0xa9, 0xfd, 0xcb, 0x5d, 0x85, 0xbb, 0xaa, 0x1f,
-  0x3d, 0x07, 0x25, 0x56, 0x23, 0xe9, 0xb4, 0x2b,
-  0x27, 0xff, 0x55, 0x9c, 0xea, 0xe0, 0xaf, 0x72,
-  0x9a, 0x26, 0x19, 0xff, 0xfb, 0x2b, 0xbc, 0x78,
-  0x15, 0xd7, 0x77, 0x05, 0x28, 0xe3, 0xa7, 0xfe,
-  0xd5, 0x71, 0xf7, 0x69, 0xd7, 0xfa, 0x38, 0xe9,
-  0xfe, 0xfa, 0x73, 0xd7, 0xd7, 0xc2, 0x74, 0xfc,
-  0xc4, 0xcf, 0xdd, 0xbc, 0xe9, 0xf2, 0x67, 0xee,
-  0xde, 0x74, 0xfd, 0x6f, 0x5e, 0x9c, 0xfe, 0xe3,
-  0xd8, 0x61, 0x7c, 0xff, 0xff, 0xbf, 0x81, 0xd4,
-  0xbe, 0x5b, 0x77, 0xf1, 0xef, 0x67, 0xdf, 0x75,
-  0x0e, 0x9f, 0x9b, 0x6f, 0xbf, 0xd0, 0x07, 0x4f,
-  0xfe, 0x4b, 0x81, 0x1d, 0x8f, 0xdd, 0xed, 0x02,
-  0x74, 0x21, 0xfe, 0xf8, 0xc6, 0x7e, 0xa7, 0xb5,
-  0xb3, 0xae, 0x74, 0xff, 0xff, 0x87, 0x1b, 0x27,
-  0xef, 0xbb, 0x7f, 0xd2, 0xdd, 0xeb, 0xa5, 0xe8,
-  0x74, 0xb1, 0xf4, 0x4f, 0x89, 0x7c, 0xf7, 0x6f,
-  0xdb, 0x0e, 0x95, 0x5b, 0x8a, 0xc7, 0xb6, 0x4a,
-  0x58, 0x48, 0xb4, 0x91, 0x68, 0x78, 0x7e, 0x18,
-  0x1a, 0x14, 0x4f, 0x85, 0x7b, 0x94, 0xd1, 0x57,
-  0x4f, 0xf3, 0xab, 0x82, 0xbd, 0xca, 0x68, 0x8f,
-  0x25, 0x5c, 0x3f, 0x1e, 0x30, 0x9f, 0xd5, 0xc1,
-  0x5e, 0xe5, 0x34, 0x58, 0x33, 0xfa, 0xb8, 0x2b,
-  0xdc, 0xa6, 0x8b, 0x2a, 0x7f, 0x57, 0x05, 0x7b,
-  0x94, 0xd1, 0x69, 0xcf, 0x2f, 0x72, 0x9a, 0x2d,
-  0xc9, 0xff, 0x93, 0x07, 0x3f, 0xba, 0xd8, 0xf8,
-  0x4e, 0x81, 0x3e, 0xfa, 0x15, 0xcf, 0xfb, 0x9d,
-  0x5c, 0x15, 0xee, 0x53, 0x45, 0x0f, 0x3f, 0x7d,
-  0xb9, 0x82, 0x94, 0x3a, 0x7f, 0xfe, 0xcd, 0xac,
-  0x9b, 0xeb, 0x7f, 0xf0, 0x29, 0x44, 0x01, 0x52,
-  0xae, 0x23, 0xcd, 0x84, 0x3a, 0x23, 0x37, 0x97,
-  0xcf, 0xea, 0xe0, 0xaf, 0x72, 0x9a, 0x2f, 0x38,
-  0x45, 0xfa, 0xa7, 0x18, 0x6c, 0xa5, 0x92, 0xdf,
-  0x1f, 0x87, 0x90, 0x93, 0x30, 0xee, 0xc7, 0x7f,
-  0x8e, 0x75, 0xb2, 0x34, 0xfe, 0xae, 0x0a, 0xf7,
-  0x29, 0xa2, 0x96, 0x9f, 0xd5, 0xc1, 0x5e, 0xe5,
-  0x34, 0x58, 0x53, 0xfa, 0xb8, 0x2b, 0xdc, 0xa6,
-  0x8b, 0x2e, 0x7f, 0xf5, 0x59, 0xce, 0xae, 0x0a,
-  0xf7, 0x29, 0xa2, 0x8c, 0x9f, 0xd5, 0x46, 0xc8,
-  0x28, 0x03, 0xa1, 0xc9, 0x9a, 0x89, 0xdb, 0x0e,
-  0xe8, 0x77, 0x75, 0x29, 0xff, 0xab, 0xce, 0xae,
-  0x0a, 0xf7, 0x29, 0xa2, 0x39, 0x9f, 0xfd, 0x56,
-  0x73, 0xab, 0x82, 0xbd, 0xca, 0x68, 0x9c, 0xa7,
-  0xf5, 0x70, 0x57, 0xb9, 0x4d, 0x16, 0x64, 0xfe,
-  0xae, 0x0a, 0xf7, 0x29, 0xa2, 0xdd, 0x9f, 0xfd,
-  0x56, 0x73, 0xab, 0x82, 0xbd, 0xca, 0x68, 0xa4,
-  0x27, 0xfe, 0xaf, 0x3a, 0xb8, 0x2b, 0xdc, 0xa6,
-  0x89, 0x4a, 0x1e, 0x4e, 0xc9, 0xa4, 0xc6, 0x29,
-  0x7c, 0xee, 0xe7, 0x7a, 0x8a, 0x53, 0xfe, 0xe7,
-  0x57, 0x05, 0x7b, 0x94, 0xd1, 0x3b, 0x4f, 0xff,
-  0xbd, 0xb6, 0x8c, 0x4d, 0x4e, 0xdb, 0xe9, 0xfc,
-  0x53, 0xa6, 0x65, 0x58, 0x89, 0xfe, 0x46, 0x9f,
-  0x0a, 0xf7, 0x29, 0xa2, 0x2c, 0x9f, 0xf7, 0x3a,
-  0xb8, 0x2b, 0xdc, 0xa6, 0x89, 0x76, 0x7f, 0xfe,
-  0xcd, 0xac, 0x9b, 0xeb, 0x7f, 0xf0, 0x29, 0x44,
-  0x01, 0x52, 0xae, 0x23, 0x4d, 0x86, 0x0d, 0xe8,
-  0xd3, 0xff, 0xaa, 0xce, 0x75, 0x70, 0x57, 0xb9,
-  0x4d, 0x13, 0x14, 0xfe, 0xae, 0x0a, 0xf7, 0x29,
-  0xa2, 0xa9, 0x9f, 0xfd, 0x56, 0x73, 0xab, 0x82,
-  0xbd, 0xca, 0x68, 0x9d, 0x27, 0xf7, 0xb8, 0x51,
-  0xdc, 0xd8, 0xe9, 0xf3, 0x48, 0xd2, 0x50, 0xe9,
-  0xf8, 0x39, 0xe6, 0xd9, 0xf3, 0xa7, 0xbd, 0x64,
-  0xaf, 0x8f, 0x5a, 0x85, 0x13, 0xff, 0x69, 0x4b,
-  0xa3, 0xf5, 0xd1, 0xaf, 0x30, 0xe8, 0x62, 0x20,
-  0xac, 0x73, 0x3f, 0xee, 0x75, 0x70, 0x57, 0xb9,
-  0x4d, 0x13, 0xbc, 0xfa, 0xfa, 0x73, 0x3c, 0x54,
-  0xab, 0xb2, 0x73, 0x79, 0x18, 0x53, 0x08, 0xf9,
-  0x1a, 0x7f, 0xf5, 0x59, 0xce, 0xae, 0x0a, 0xf7,
-  0x29, 0xa2, 0x85, 0x9f, 0xfd, 0x56, 0x73, 0xab,
-  0x82, 0xbd, 0xca, 0x68, 0xa4, 0xa7, 0xff, 0xf6,
-  0x52, 0xbb, 0xf1, 0xab, 0x73, 0x2f, 0x64, 0xbe,
-  0x8c, 0x3a, 0x1e, 0x5c, 0x03, 0x71, 0xc2, 0xa9,
-  0x09, 0xdb, 0x23, 0xed, 0x02, 0x4e, 0x8a, 0x4d,
-  0xea, 0x53, 0xfa, 0xb8, 0x2b, 0xdc, 0xa6, 0x88,
-  0x92, 0x7f, 0xf5, 0x59, 0xce, 0xae, 0x0a, 0xf7,
-  0x29, 0xa2, 0x5e, 0x9f, 0x0a, 0xf7, 0x29, 0xa2,
-  0x97, 0x9f, 0xc9, 0xb6, 0xa7, 0x98, 0x94, 0x3a,
-  0x55, 0xc3, 0xe6, 0xb9, 0x84, 0xfe, 0xae, 0x0a,
-  0xf7, 0x29, 0xa2, 0x9c, 0x9f, 0xf7, 0x87, 0xa9,
-  0x6c, 0xcf, 0xa9, 0xd3, 0xfe, 0xcb, 0x20, 0xe5,
-  0x42, 0x10, 0x95, 0x37, 0x82, 0x74, 0xcf, 0x57,
-  0x64, 0x46, 0xb7, 0x9d, 0xea, 0x1e, 0x4f, 0x85,
-  0x7b, 0x94, 0xd1, 0x5e, 0x4f, 0xff, 0xd9, 0xb5,
-  0x93, 0x7d, 0x6f, 0xfe, 0x05, 0x28, 0x80, 0x2a,
-  0x55, 0xc4, 0x46, 0xb7, 0x98, 0x4f, 0xfd, 0x5e,
-  0x75, 0x70, 0x57, 0xb9, 0x4d, 0x12, 0x3c, 0xef,
-  0x01, 0x0e, 0x9c, 0xb8, 0xc2, 0xaa, 0x5d, 0xcf,
-  0x85, 0x7b, 0x94, 0xd1, 0x24, 0x4f, 0x57, 0x9d,
-  0x54, 0x3d, 0x9c, 0x29, 0x9f, 0xfa, 0xbc, 0xea,
-  0xe0, 0xaf, 0x72, 0x9a, 0x24, 0xa9, 0xf0, 0xaf,
-  0x72, 0x9a, 0x2f, 0x19, 0xfb, 0x4f, 0xbf, 0xcf,
-  0xd0, 0xe9, 0xf5, 0x29, 0x7c, 0x53, 0xa7, 0xf9,
-  0xd5, 0xc1, 0x5e, 0xe5, 0x34, 0x49, 0xb2, 0xae,
-  0x23, 0x1d, 0xf3, 0x01, 0x30, 0xe2, 0x68, 0x45,
-  0xd2, 0x97, 0x8e, 0xdd, 0x0b, 0x8d, 0x89, 0xfd,
-  0x0c, 0x86, 0xa1, 0xa2, 0xc2, 0xbb, 0x43, 0x02,
-  0xe6, 0xfa, 0x46, 0x27, 0x09, 0x1a, 0x9f, 0x53,
-  0xd1, 0xd7, 0x3a, 0x3c, 0x9d, 0xa3, 0xda, 0xcb,
-  0x6e, 0xc3, 0xae, 0x52, 0xb2, 0xd7, 0xb6, 0x6f,
-  0xcf, 0x3d, 0xfa, 0x73, 0x13, 0x57, 0x1d, 0x83,
-  0x54, 0xb5, 0x61, 0x9f, 0xe3, 0x65, 0xff, 0x0f,
-  0xda, 0x76, 0x9b, 0xa9, 0xc1, 0x20, 0x96, 0x1c,
-  0xdd, 0xc2, 0xc7, 0xf3, 0xc0, 0x54, 0xa4, 0x6f,
-  0xde, 0xb8, 0x08, 0xd2, 0x94, 0xdc, 0xda, 0x3d,
-  0x60, 0xc7, 0xf8, 0xdf, 0x0f, 0xcd, 0xf3, 0xa0,
-  0x9a, 0x93, 0xb4, 0xd0,
+  0xfe, 0x76, 0x0a, 0x77, 0x21, 0xa2, 0x25, 0x9f,
+  0x0a, 0x77, 0x21, 0xa2, 0x2d, 0x9b, 0x29, 0x2a,
+  0x4a, 0x54, 0xbe, 0x13, 0x4b, 0xf0, 0xb4, 0xfe,
+  0xbe, 0x0f, 0xcc, 0xf5, 0x4a, 0x71, 0xa8, 0x9f,
+  0x9f, 0x6f, 0x36, 0xc6, 0x8e, 0x85, 0x3f, 0x3e,
+  0x43, 0x93, 0xb1, 0x31, 0x0d, 0x48, 0x78, 0x4f,
+  0xe7, 0x60, 0xa7, 0x72, 0x1a, 0x2a, 0x29, 0xff,
+  0xeb, 0x7a, 0xce, 0xd7, 0x99, 0x46, 0xcb, 0x9b,
+  0x1d, 0x3e, 0x14, 0xee, 0x43, 0x45, 0x7b, 0x3e,
+  0xf3, 0x7a, 0x69, 0x41, 0xd2, 0x76, 0x1e, 0xe0,
+  0x98, 0x4f, 0xfc, 0xee, 0x7b, 0xb0, 0x53, 0xb9,
+  0x0d, 0x12, 0x34, 0xff, 0xe7, 0x33, 0x9e, 0xec,
+  0x14, 0xee, 0x43, 0x44, 0xf1, 0x3f, 0xf9, 0xcc,
+  0xe7, 0xbb, 0x05, 0x3b, 0x90, 0xd1, 0x3f, 0xcf,
+  0xfe, 0x73, 0x39, 0xee, 0xc1, 0x4e, 0xe4, 0x34,
+  0x50, 0xd3, 0xff, 0x9c, 0xce, 0x7b, 0xb0, 0x53,
+  0xb9, 0x0d, 0x14, 0x44, 0xff, 0xb9, 0xee, 0xc1,
+  0x4e, 0xe4, 0x34, 0x52, 0x33, 0xff, 0xf6, 0x6d,
+  0x65, 0xde, 0xeb, 0x87, 0x7d, 0x5a, 0xaf, 0xc5,
+  0x49, 0xcc, 0x45, 0x26, 0xa2, 0x34, 0xff, 0xce,
+  0xe7, 0xbb, 0x05, 0x3b, 0x90, 0xd1, 0x28, 0x45,
+  0x0b, 0xa7, 0x8f, 0x8d, 0x2d, 0x0c, 0x75, 0x67,
+  0x63, 0x0a, 0xf6, 0x13, 0x59, 0x33, 0xe5, 0x26,
+  0xed, 0x4a, 0xaa, 0x5a, 0x43, 0xd9, 0xbc, 0xb2,
+  0x7f, 0xf3, 0x99, 0xcf, 0x76, 0x0a, 0x77, 0x21,
+  0xa2, 0x73, 0x9f, 0xfc, 0xe6, 0x73, 0xdd, 0x82,
+  0x9d, 0xc8, 0x68, 0xa2, 0x67, 0xfe, 0x17, 0xba,
+  0xde, 0xab, 0x4f, 0xf7, 0xc7, 0x40, 0xa3, 0xae,
+  0xaa, 0x5a, 0x29, 0x4f, 0xe7, 0x60, 0xa7, 0x72,
+  0x1a, 0x21, 0xc9, 0xf0, 0xa7, 0x72, 0x1a, 0x22,
+  0xf9, 0xf7, 0x5d, 0xeb, 0xac, 0xa9, 0x3b, 0x0f,
+  0x60, 0x0c, 0x27, 0xff, 0x39, 0x9c, 0xf7, 0x60,
+  0xa7, 0x72, 0x1a, 0x26, 0x49, 0xfc, 0xec, 0x14,
+  0xee, 0x43, 0x45, 0xbd, 0x3f, 0xf9, 0xcc, 0xe7,
+  0xbb, 0x05, 0x3b, 0x90, 0xd1, 0x49, 0xc2, 0xa7,
+  0x30, 0xf8, 0x49, 0xe1, 0x35, 0x54, 0x9b, 0x1d,
+  0xcf, 0xe7, 0x60, 0xa7, 0x72, 0x1a, 0x21, 0xd9,
+  0xff, 0xce, 0x67, 0x3d, 0xd8, 0x29, 0xdc, 0x86,
+  0x89, 0x62, 0x7f, 0x3b, 0x05, 0x3b, 0x90, 0xd1,
+  0x18, 0x4f, 0xfc, 0xee, 0x7b, 0xb0, 0x53, 0xb9,
+  0x0d, 0x11, 0xec, 0xfe, 0x76, 0x0a, 0x77, 0x21,
+  0xa2, 0xc3, 0x9f, 0xce, 0xc1, 0x4e, 0xe4, 0x34,
+  0x5c, 0xf0, 0xa9, 0xc5, 0x50, 0x76, 0xf5, 0x2f,
+  0x1d, 0xb1, 0x32, 0xe7, 0x73, 0xf9, 0xd8, 0x29,
+  0xdc, 0x86, 0x88, 0x7a, 0x7c, 0x29, 0xdc, 0x86,
+  0x88, 0x9a, 0x6b, 0xb0, 0xe9, 0xff, 0xd9, 0x6d,
+  0xf4, 0x55, 0x7d, 0x4d, 0xd5, 0x87, 0x45, 0x27,
+  0xc7, 0x61, 0x69, 0xeb, 0xe9, 0xdb, 0xcd, 0x10,
+  0xbc, 0x9d, 0x88, 0xe7, 0xac, 0x24, 0xf4, 0x23,
+  0x9e, 0xbd, 0xbd, 0x73, 0xa7, 0xff, 0x79, 0xa7,
+  0xe5, 0x2f, 0xdc, 0xce, 0xe0, 0x3a, 0x6e, 0x6f,
+  0x3a, 0x5a, 0xa6, 0x22, 0x1a, 0xc4, 0x5c, 0x99,
+  0x3e, 0xb7, 0x5f, 0x9e, 0x74, 0xf7, 0xab, 0xef,
+  0x8e, 0x9d, 0xff, 0xff, 0x95, 0x3e, 0xe0, 0xbd,
+  0xb0, 0xa7, 0x17, 0xf3, 0xee, 0xbb, 0x59, 0x73,
+  0xa3, 0x64, 0x4e, 0xfc, 0x84, 0x06, 0x93, 0xff,
+  0x7d, 0xe6, 0xb7, 0x59, 0x7c, 0x3a, 0x6a, 0xce,
+  0x9f, 0xf7, 0xb5, 0xa8, 0x2d, 0x57, 0xcc, 0x3a,
+  0x7e, 0xc6, 0xda, 0x3f, 0x2a, 0x74, 0xf6, 0x6d,
+  0x94, 0x1d, 0x18, 0x9e, 0x87, 0xa1, 0x86, 0xd1,
+  0x8d, 0x93, 0x40, 0xfa, 0xe5, 0xf3, 0xf6, 0x7e,
+  0xb9, 0xb7, 0x8e, 0x9f, 0xff, 0xfc, 0x01, 0x4a,
+  0xeb, 0x0c, 0xda, 0xde, 0x6b, 0x75, 0x72, 0x97,
+  0x8e, 0x7e, 0x74, 0xfb, 0xd7, 0xd1, 0x68, 0x3a,
+  0x7f, 0x52, 0xfa, 0xeb, 0xd1, 0x69, 0x3a, 0x7f,
+  0x77, 0xfa, 0x34, 0xb7, 0xe3, 0xa3, 0xc7, 0xd8,
+  0x07, 0x10, 0xa9, 0x99, 0xe3, 0xe8, 0xc2, 0x56,
+  0x6d, 0x1e, 0x74, 0xee, 0xbd, 0x4e, 0x9b, 0x4a,
+  0x0e, 0x9e, 0x50, 0xbb, 0x4f, 0x36, 0x62, 0x37,
+  0x3f, 0xfe, 0xd1, 0x6f, 0xb8, 0x34, 0x6f, 0xdd,
+  0x97, 0xd4, 0xcb, 0x9d, 0x3f, 0xf5, 0x97, 0x5e,
+  0xeb, 0x87, 0x5d, 0x6e, 0x74, 0xfe, 0xdd, 0x4b,
+  0xfd, 0x6d, 0x18, 0x74, 0x7c, 0x7f, 0xc0, 0x8d,
+  0x3f, 0xe1, 0x6b, 0x75, 0x57, 0xd4, 0x75, 0xce,
+  0x85, 0x3e, 0x3d, 0x08, 0xa7, 0xff, 0xff, 0xb4,
+  0x0a, 0x88, 0x2b, 0x5b, 0xb7, 0xdf, 0xcf, 0xca,
+  0x6f, 0x8d, 0x83, 0x2a, 0x74, 0x94, 0xe9, 0xfc,
+  0xfe, 0x1f, 0x55, 0x69, 0x3a, 0x7f, 0xff, 0xff,
+  0x7b, 0xea, 0x86, 0x75, 0x3b, 0xb6, 0xb6, 0x9b,
+  0x83, 0x29, 0x7e, 0x69, 0x40, 0x67, 0x52, 0x74,
+  0xee, 0xe4, 0x34, 0x53, 0x11, 0x88, 0xbd, 0x48,
+  0x4b, 0xcf, 0xfb, 0x02, 0x97, 0xd6, 0xea, 0x2d,
+  0x1d, 0x3e, 0xa4, 0x31, 0xb6, 0x1d, 0x1e, 0x3e,
+  0x6e, 0x3e, 0x9f, 0xee, 0x66, 0xd6, 0x5a, 0x33,
+  0xf3, 0xa7, 0xff, 0xf0, 0x62, 0x5e, 0xeb, 0x7a,
+  0xb4, 0x19, 0xfe, 0xe5, 0x6e, 0xa7, 0x4f, 0xf9,
+  0x15, 0x96, 0xca, 0xe7, 0x80, 0xe8, 0x54, 0x51,
+  0x59, 0x9e, 0x7c, 0x2a, 0xd9, 0x44, 0xe9, 0xfb,
+  0x83, 0x76, 0xca, 0x07, 0x46, 0x1f, 0xaf, 0x88,
+  0xb4, 0x26, 0x8a, 0x17, 0x64, 0xb6, 0x4a, 0xd6,
+  0x6e, 0x91, 0xa0, 0xd2, 0x45, 0xe8, 0x41, 0xb4,
+  0x1e, 0x30, 0xef, 0x64, 0x23, 0x00, 0x86, 0xf1,
+  0xa8, 0xcf, 0xfb, 0x58, 0xf7, 0xfb, 0xbb, 0x6e,
+  0xa0, 0xe9, 0xec, 0x0d, 0x7a, 0xb3, 0xa7, 0xff,
+  0xff, 0xd6, 0xf5, 0xed, 0x82, 0xad, 0xb7, 0x33,
+  0x46, 0xfd, 0xd9, 0x4b, 0xf3, 0x40, 0xfa, 0xa7,
+  0x4a, 0xfe, 0x45, 0xad, 0x49, 0xa7, 0xff, 0xd9,
+  0x96, 0xf2, 0x5b, 0x37, 0x57, 0x4b, 0x2e, 0xac,
+  0xe9, 0xff, 0xeb, 0xdb, 0x3e, 0xdc, 0xc5, 0xcb,
+  0xed, 0x80, 0x74, 0xff, 0x53, 0xb9, 0x8b, 0x81,
+  0x7d, 0x43, 0xa5, 0x5c, 0x44, 0x77, 0x28, 0xcb,
+  0xc0, 0x98, 0x7d, 0xe1, 0xd1, 0x3e, 0x7a, 0xd2,
+  0xfa, 0x9d, 0x3f, 0xff, 0xff, 0xec, 0x0d, 0x7b,
+  0xbd, 0x6d, 0x1c, 0xd7, 0xae, 0xac, 0x0e, 0xd7,
+  0x6f, 0x3b, 0x2d, 0x4f, 0xcb, 0xb1, 0x53, 0xff,
+  0xff, 0x27, 0xbf, 0xdb, 0x41, 0xdd, 0xa2, 0xd1,
+  0x54, 0xb6, 0x96, 0xa7, 0xbf, 0x3a, 0x6d, 0x28,
+  0xa5, 0x34, 0x7f, 0x14, 0x56, 0x14, 0x90, 0xaa,
+  0xbc, 0xad, 0x19, 0xc0, 0x46, 0xeb, 0x3f, 0xf9,
+  0x89, 0xba, 0xdc, 0xfc, 0x67, 0x07, 0xc7, 0x4f,
+  0xff, 0xbc, 0x17, 0xb6, 0x37, 0xdd, 0xac, 0xd5,
+  0xf0, 0x7c, 0x74, 0xff, 0xca, 0x14, 0x06, 0x36,
+  0xae, 0x8b, 0x49, 0xd1, 0x54, 0x51, 0x68, 0xb9,
+  0x3d, 0x97, 0xc6, 0xec, 0xe9, 0xda, 0x99, 0x63,
+  0xa6, 0xcd, 0x8e, 0x8a, 0x13, 0x69, 0x7c, 0x3b,
+  0x2a, 0x49, 0x72, 0x56, 0xc3, 0xd3, 0xf6, 0xca,
+  0x16, 0xe7, 0x9d, 0x39, 0x76, 0x53, 0xa7, 0xf3,
+  0x4f, 0xcb, 0xd7, 0x9a, 0xdc, 0x78, 0xec, 0x2c,
+  0x9f, 0x9b, 0xed, 0xda, 0xb5, 0xf8, 0xe9, 0xfc,
+  0x2d, 0x06, 0x5b, 0xae, 0x74, 0x61, 0xf2, 0xf8,
+  0xd2, 0x7e, 0x5f, 0xb2, 0xfb, 0xe8, 0x3a, 0x1e,
+  0x7a, 0x20, 0x43, 0x3f, 0xff, 0xeb, 0x87, 0x7d,
+  0x5a, 0x33, 0xc1, 0x70, 0xc6, 0xdb, 0xab, 0xf8,
+  0x1d, 0x3f, 0xef, 0x63, 0x5b, 0xaa, 0xb6, 0xed,
+  0x59, 0xd3, 0xfb, 0xa9, 0xad, 0xb3, 0x84, 0xe8,
+  0xd8, 0xfd, 0x6e, 0x89, 0x26, 0x1d, 0x38, 0x33,
+  0x63, 0xa1, 0x4d, 0x5d, 0x22, 0x13, 0xf5, 0x35,
+  0xcc, 0x0d, 0x67, 0x4f, 0x33, 0x7a, 0xfc, 0x74,
+  0x61, 0xe9, 0x78, 0xba, 0x15, 0x3c, 0x7c, 0x87,
+  0x2f, 0x93, 0x85, 0xce, 0x7f, 0x5f, 0xd4, 0x65,
+  0xb4, 0xb9, 0xd3, 0xd9, 0x4a, 0xb4, 0x74, 0xfd,
+  0x6e, 0x7b, 0x07, 0xc7, 0x4f, 0xbd, 0xf0, 0xe5,
+  0x27, 0x46, 0xb4, 0x55, 0xf8, 0xd7, 0xe2, 0x2d,
+  0x0b, 0x27, 0xff, 0xe1, 0x7d, 0xb1, 0xab, 0x28,
+  0x6b, 0x0c, 0xbd, 0xb4, 0x3a, 0x7f, 0xff, 0x7b,
+  0x29, 0x7d, 0x6f, 0x65, 0x62, 0xfb, 0x6d, 0xca,
+  0xdd, 0x4e, 0x9f, 0xff, 0xff, 0x68, 0x1b, 0xbf,
+  0xea, 0x5e, 0x3d, 0xf6, 0xea, 0xe8, 0xb4, 0xdb,
+  0x3c, 0x19, 0xac, 0xe9, 0xff, 0xf6, 0x82, 0x39,
+  0x7a, 0xdb, 0xd9, 0xba, 0xdf, 0x29, 0xd1, 0x88,
+  0xe3, 0xb4, 0x23, 0x27, 0xff, 0x9e, 0xdf, 0x6c,
+  0x50, 0x68, 0x32, 0xf5, 0xe3, 0xa7, 0xff, 0xdb,
+  0x63, 0x37, 0x37, 0xdd, 0x6a, 0xd3, 0xf8, 0x68,
+  0x3a, 0x7f, 0xb0, 0x28, 0xdd, 0xf7, 0x73, 0x47,
+  0x4f, 0xfa, 0xba, 0x06, 0xea, 0xe9, 0xa9, 0xa0,
+  0x9d, 0x3f, 0xfa, 0x8d, 0xd5, 0xb6, 0x9b, 0xaf,
+  0x5a, 0xa8, 0x9d, 0x3f, 0xff, 0xec, 0xa6, 0xbe,
+  0xcf, 0xf7, 0x5b, 0x2f, 0x5c, 0xa3, 0x76, 0x7b,
+  0x63, 0xa3, 0x11, 0x87, 0xe5, 0x08, 0xa1, 0x5c,
+  0x32, 0x46, 0x9b, 0x49, 0x3f, 0x94, 0x18, 0xb9,
+  0x53, 0xbb, 0xc6, 0x13, 0x3f, 0xee, 0x1b, 0x65,
+  0xd4, 0x3d, 0xf1, 0xd3, 0xfd, 0x9f, 0xd2, 0xfa,
+  0xee, 0xbf, 0x8e, 0x9f, 0xff, 0xf2, 0xa2, 0xb3,
+  0x73, 0x56, 0xf0, 0x6d, 0xbb, 0x7a, 0x06, 0x5b,
+  0x0e, 0x84, 0x47, 0x48, 0x1e, 0x37, 0x9e, 0xcf,
+  0x7a, 0xfe, 0x53, 0xa7, 0xff, 0xff, 0xeb, 0xab,
+  0x03, 0xda, 0xed, 0xcd, 0x6e, 0x0d, 0x1b, 0xf7,
+  0x65, 0x2f, 0xcd, 0x03, 0xea, 0x9d, 0x0f, 0x45,
+  0xb7, 0x88, 0x61, 0x57, 0x92, 0x32, 0x5f, 0x17,
+  0xa3, 0x5c, 0xe8, 0x73, 0xcf, 0x5e, 0xbd, 0xf1,
+  0xd3, 0xff, 0x5b, 0xdb, 0xbc, 0x3a, 0x51, 0xc2,
+  0x87, 0x4f, 0xd7, 0xe1, 0x0a, 0x7c, 0x74, 0x62,
+  0x25, 0x35, 0x91, 0x5d, 0x1a, 0x7b, 0x7e, 0x9d,
+  0x53, 0xa7, 0xff, 0xef, 0x0e, 0xec, 0xf6, 0x06,
+  0xbb, 0x7b, 0x19, 0x88, 0x74, 0xff, 0xff, 0x7a,
+  0x81, 0x56, 0x57, 0x45, 0xdc, 0xa2, 0xbb, 0x59,
+  0x58, 0x74, 0x62, 0x30, 0xc5, 0x6e, 0x7f, 0xff,
+  0xf0, 0x8f, 0xa8, 0xdd, 0x6c, 0xb8, 0x2b, 0x56,
+  0xca, 0x16, 0x9b, 0xe8, 0x87, 0x4f, 0xff, 0xfc,
+  0xba, 0xec, 0xbb, 0x83, 0x34, 0xd7, 0xba, 0x97,
+  0xd7, 0xc1, 0xbd, 0x68, 0x3a, 0x7d, 0x4d, 0x7d,
+  0x80, 0x74, 0x62, 0x29, 0x34, 0x7d, 0x8f, 0x26,
+  0x85, 0x68, 0xc7, 0xe7, 0xf8, 0x34, 0x68, 0x32,
+  0xdd, 0x73, 0xa7, 0xfb, 0x6b, 0x2f, 0xfb, 0x5b,
+  0x98, 0x74, 0xff, 0xff, 0x70, 0xdb, 0x2f, 0xec,
+  0x0a, 0x2a, 0xb8, 0x1b, 0x59, 0x4e, 0x9e, 0xbe,
+  0xea, 0x04, 0xe8, 0xa5, 0x10, 0xfc, 0xc7, 0x3f,
+  0x35, 0x4b, 0xf4, 0x5b, 0x9d, 0x3f, 0xd6, 0xe6,
+  0x06, 0x5b, 0xae, 0x74, 0x29, 0xf3, 0x54, 0xc2,
+  0x7e, 0xcb, 0x88, 0xe3, 0xce, 0x9f, 0x83, 0x2c,
+  0x18, 0x87, 0x4f, 0x06, 0x57, 0x73, 0x47, 0xa7,
+  0x72, 0xa8, 0xd9, 0x5d, 0xfa, 0x46, 0xc7, 0xe2,
+  0xa1, 0x38, 0xb4, 0x30, 0xaf, 0x08, 0x96, 0xce,
+  0x93, 0xff, 0x00, 0x66, 0xe1, 0xcb, 0x06, 0x34,
+  0x74, 0x2a, 0xea, 0xfe, 0x4e, 0x53, 0x73, 0xbc,
+  0xf8, 0x15, 0x9d, 0xb1, 0xd3, 0xfb, 0x1a, 0xb6,
+  0x5d, 0x76, 0x3a, 0x7f, 0xff, 0xfa, 0xd9, 0x7a,
+  0xf3, 0x5b, 0x83, 0x29, 0x7e, 0x69, 0x40, 0x66,
+  0xd6, 0xf3, 0x47, 0x4d, 0xa6, 0xb3, 0xa0, 0x51,
+  0x39, 0x78, 0x41, 0xcf, 0xd9, 0x40, 0x65, 0x35,
+  0x3a, 0x7f, 0xf0, 0xd2, 0xfa, 0xe3, 0x29, 0x5b,
+  0x59, 0x4e, 0x95, 0x4e, 0x8d, 0x0f, 0x6b, 0x7a,
+  0x54, 0xfe, 0x56, 0x06, 0x5b, 0xae, 0x74, 0xff,
+  0xff, 0xae, 0x0b, 0xf5, 0x2f, 0xae, 0x8b, 0x70,
+  0xcd, 0xbd, 0x82, 0xd1, 0xd1, 0xe5, 0x4c, 0xcd,
+  0x13, 0x74, 0x33, 0xc0, 0x9e, 0xb0, 0x87, 0xd0,
+  0x97, 0x79, 0x84, 0xf9, 0xfe, 0x1c, 0xa4, 0xe9,
+  0xf6, 0x56, 0x8c, 0xfc, 0xe8, 0xa4, 0xf3, 0xec,
+  0x4f, 0x3f, 0xfe, 0xf5, 0x18, 0x9b, 0x5b, 0xd9,
+  0xaf, 0x76, 0xbd, 0x14, 0xe9, 0xe6, 0xfb, 0xe5,
+  0x8e, 0x9f, 0xff, 0xf9, 0xbe, 0x97, 0xf5, 0x3b,
+  0x83, 0x46, 0xfd, 0xd9, 0x4b, 0xf3, 0x40, 0xfa,
+  0xa7, 0x45, 0x08, 0xa5, 0xc2, 0x49, 0xff, 0xff,
+  0xf2, 0xd3, 0x5d, 0x16, 0x9d, 0xd6, 0xcd, 0xb7,
+  0x06, 0x69, 0xaf, 0x75, 0x7e, 0xfb, 0xd7, 0x3a,
+  0x7c, 0xa1, 0x4f, 0x50, 0x74, 0xff, 0xff, 0xff,
+  0xec, 0x66, 0x22, 0xd9, 0x59, 0x7c, 0xad, 0x54,
+  0x45, 0x43, 0x28, 0xcd, 0x2b, 0xa3, 0x40, 0xac,
+  0x3a, 0x7f, 0xbe, 0xcd, 0x83, 0x2d, 0xd7, 0x3a,
+  0x7f, 0x51, 0xa2, 0xdd, 0x9e, 0xb9, 0xd3, 0xfe,
+  0x5d, 0x6d, 0xfa, 0x60, 0x35, 0xbd, 0x87, 0x46,
+  0x1f, 0xdd, 0x26, 0xb3, 0xff, 0xd9, 0x7d, 0xb3,
+  0x3e, 0xae, 0xe1, 0xae, 0xd5, 0x3a, 0x7a, 0x8f,
+  0x05, 0xce, 0x85, 0x57, 0xd9, 0x84, 0x7e, 0x8c,
+  0x08, 0x48, 0xd9, 0x09, 0x2b, 0x13, 0xf4, 0x28,
+  0x42, 0x16, 0x75, 0x22, 0xd1, 0x4e, 0x76, 0xdb,
+  0x9a, 0x3a, 0x7f, 0xfa, 0x97, 0x82, 0xee, 0x60,
+  0x2e, 0xbb, 0xfa, 0x83, 0xa3, 0x0f, 0xd3, 0xc4,
+  0x13, 0xf5, 0x0d, 0x3d, 0xb8, 0x34, 0x1d, 0x3e,
+  0x67, 0xb6, 0xcd, 0x8e, 0x93, 0x47, 0x4c, 0xac,
+  0x3a, 0x57, 0x3a, 0x04, 0xd2, 0xf0, 0xac, 0x6c,
+  0x7a, 0xb6, 0x36, 0x9e, 0xbd, 0x7a, 0x93, 0xa6,
+  0x6b, 0x8e, 0x9f, 0xd6, 0xf0, 0xd2, 0xf0, 0x53,
+  0xa3, 0x55, 0xa6, 0x7e, 0xa6, 0x98, 0xfd, 0xe2,
+  0x36, 0x11, 0x68, 0x2d, 0x3f, 0xab, 0xea, 0x7f,
+  0xe0, 0xf8, 0xe9, 0xff, 0xf2, 0x8a, 0xa6, 0x31,
+  0x51, 0xfe, 0xae, 0x8c, 0x3a, 0x1a, 0x44, 0x3e,
+  0xa1, 0xac, 0xe0, 0xe6, 0x1d, 0x37, 0xca, 0x74,
+  0x78, 0xd8, 0x00, 0xd4, 0x9c, 0xdc, 0x75, 0x8a,
+  0xeb, 0x28, 0x26, 0x85, 0xcd, 0xa3, 0x60, 0xc9,
+  0xdc, 0x5d, 0x70, 0xb9, 0x49, 0x7d, 0x54, 0xc7,
+  0x4b, 0xe8, 0x4d, 0x35, 0x18, 0x20, 0xc7, 0xd0,
+  0xc8, 0x75, 0xda, 0x7a, 0x27, 0xa1, 0xc6, 0x13,
+  0xb2, 0x15, 0x95, 0x3d, 0x79, 0xca, 0xd6, 0xd1,
+  0x89, 0x6a, 0x46, 0xc1, 0xbe, 0x1c, 0x8d, 0xea,
+  0xf3, 0xf9, 0xd8, 0x29, 0xdc, 0x86, 0x8a, 0x76,
+  0x7c, 0x29, 0xdc, 0x86, 0x8a, 0x8e, 0x7f, 0xdc,
+  0xf7, 0x60, 0xa7, 0x72, 0x1a, 0x26, 0x89, 0x3b,
+  0x0f, 0xd9, 0x86, 0x13, 0xf9, 0xd8, 0x29, 0xdc,
+  0x86, 0x8a, 0xbe, 0x7c, 0x29, 0xdc, 0x86, 0x8a,
+  0xda, 0x7f, 0x9e, 0xec, 0x14, 0xee, 0x43, 0x44,
+  0x83, 0x27, 0x61, 0xf8, 0xf1, 0x84, 0xff, 0xce,
+  0xe7, 0xbb, 0x05, 0x3b, 0x90, 0xd1, 0x21, 0xcf,
+  0x85, 0x3b, 0x90, 0xd1, 0x62, 0x4f, 0xb0, 0x54,
+  0x35, 0x9d, 0x3f, 0xf2, 0xe5, 0x70, 0x36, 0xf7,
+  0xca, 0x07, 0x4e, 0x05, 0xa0, 0xe9, 0x3c, 0x0f,
+  0x77, 0x44, 0x29, 0xda, 0x9e, 0xf8, 0xe9, 0xc2,
+  0xaf, 0x3a, 0x7d, 0xcf, 0xdf, 0x65, 0x3a, 0x7e,
+  0xad, 0x47, 0xdf, 0xea, 0xce, 0x8f, 0x1e, 0xd7,
+  0x14, 0x4f, 0xf5, 0x90, 0x31, 0xb0, 0x65, 0x4e,
+  0x9f, 0xdf, 0x2e, 0x5f, 0xc1, 0xf9, 0x51, 0x89,
+  0xfd, 0x6b, 0x30, 0xa6, 0x10, 0x7e, 0x28, 0x12,
+  0x0b, 0x3a, 0x71, 0x0f, 0xc6, 0xf3, 0xff, 0x5b,
+  0xcb, 0x7b, 0x76, 0xbc, 0x0f, 0x8e, 0x9f, 0xff,
+  0xd7, 0xbf, 0x3e, 0xb8, 0x0a, 0xce, 0xcb, 0xdd,
+  0x58, 0x74, 0xff, 0xf6, 0x52, 0xfb, 0xe9, 0x43,
+  0xad, 0xcc, 0xf5, 0x4e, 0x9a, 0xce, 0xc4, 0x7a,
+  0xf9, 0x14, 0x17, 0x61, 0xc9, 0xd3, 0xac, 0x6d,
+  0xb3, 0xf9, 0xd8, 0x29, 0xdc, 0x86, 0x8b, 0x36,
+  0x7f, 0xf3, 0x99, 0xcf, 0x76, 0x0a, 0x77, 0x21,
+  0xa2, 0x80, 0x9f, 0xc1, 0x97, 0xfb, 0x78, 0x34,
+  0x74, 0xdb, 0xaa, 0x74, 0xf2, 0x77, 0x21, 0xa2,
+  0xdf, 0x9f, 0xb7, 0xdf, 0x93, 0x84, 0xe8, 0x13,
+  0xd7, 0xf8, 0xae, 0x7d, 0x77, 0xd7, 0x7d, 0x4e,
+  0x9f, 0xca, 0xdb, 0x7d, 0xc1, 0x7e, 0x3a, 0x7b,
+  0xbc, 0x17, 0x3a, 0x7f, 0x69, 0x4d, 0x55, 0x31,
+  0x87, 0x4e, 0x0c, 0x79, 0xd2, 0x72, 0xa7, 0x26,
+  0xf3, 0x5c, 0x6f, 0x12, 0x2b, 0x15, 0x7c, 0x6c,
+  0x04, 0x17, 0x33, 0x9f, 0xf7, 0x3d, 0xd8, 0x29,
+  0xdc, 0x86, 0x8a, 0x52, 0x7f, 0x9e, 0xec, 0x14,
+  0xee, 0x43, 0x44, 0x9d, 0x27, 0x31, 0x10, 0xfc,
+  0x8d, 0x0a, 0xee, 0x39, 0x28, 0x8c, 0x8b, 0x6b,
+  0x5a, 0x31, 0x91, 0xd3, 0x24, 0x2c, 0x7c, 0x4f,
+  0xab, 0x85, 0x63, 0x44, 0xcc, 0x97, 0xdb, 0x62,
+  0x9f, 0x8e, 0xeb, 0x1f, 0x2b, 0x68, 0x7e, 0x4f,
+  0x85, 0x3b, 0x90, 0xd1, 0x0f, 0xcf, 0xfb, 0x9e,
+  0xec, 0x14, 0xee, 0x43, 0x44, 0xa7, 0x27, 0x61,
+  0xfb, 0x30, 0xc2, 0x7f, 0x3b, 0x05, 0x3b, 0x90,
+  0xd1, 0x13, 0xcf, 0xe7, 0x60, 0xa7, 0x72, 0x1a,
+  0x23, 0x19, 0xff, 0xce, 0x67, 0x3d, 0xd8, 0x29,
+  0xdc, 0x86, 0x89, 0xe6, 0x15, 0x1d, 0xf4, 0x13,
+  0xbc, 0xee, 0xc7, 0x73, 0xe1, 0x4e, 0xe4, 0x34,
+  0x44, 0x13, 0xfe, 0xe7, 0xbb, 0x05, 0x3b, 0x90,
+  0xd1, 0x2a, 0x49, 0xd8, 0x7e, 0xcc, 0x30, 0x9f,
+  0xce, 0xc1, 0x4e, 0xe4, 0x34, 0x45, 0x13, 0xf9,
+  0xd8, 0x29, 0xdc, 0x86, 0x88, 0xca, 0x7f, 0xf3,
+  0x99, 0xcf, 0x76, 0x0a, 0x77, 0x21, 0xa2, 0x65,
+  0x9f, 0xce, 0xc1, 0x4e, 0xe4, 0x34, 0x54, 0x93,
+  0xf9, 0xd8, 0x29, 0xdc, 0x86, 0x8a, 0xea, 0x7f,
+  0x3b, 0x05, 0x3b, 0x90, 0xd1, 0x62, 0xcf, 0xfc,
+  0xce, 0x7b, 0xb0, 0x53, 0xb9, 0x0d, 0x13, 0xd4,
+  0xff, 0x7e, 0xee, 0x5f, 0x6a, 0x79, 0xbc, 0xe8,
+  0x72, 0x22, 0xd5, 0x32, 0x7e, 0xd5, 0x4e, 0x5f,
+  0xda, 0x54, 0xe9, 0xe1, 0x65, 0xe9, 0x3a, 0x72,
+  0x65, 0x8a, 0x9f, 0xff, 0xac, 0x1d, 0xaf, 0xc2,
+  0xaf, 0x7e, 0x57, 0xef, 0x94, 0xe9, 0xff, 0xf8,
+  0x7c, 0xdf, 0xcc, 0x72, 0x88, 0xf9, 0xbd, 0x34,
+  0xa0, 0xe9, 0xf2, 0x7a, 0xdb, 0xd8, 0x74, 0xff,
+  0xee, 0xa8, 0x67, 0xce, 0xb7, 0x93, 0x84, 0xe9,
+  0xf5, 0xec, 0xac, 0x43, 0xa7, 0xff, 0x06, 0xe5,
+  0x50, 0x56, 0x6e, 0xdd, 0x6d, 0x43, 0xa6, 0xea,
+  0x4e, 0x9f, 0xdd, 0x5e, 0xb6, 0x81, 0x41, 0xd0,
+  0x07, 0x93, 0xa0, 0xb4, 0x79, 0x50, 0x68, 0xae,
+  0x31, 0x82, 0xc5, 0x20, 0x8f, 0x72, 0x66, 0xf8,
+  0x4c, 0xce, 0x0e, 0xb9, 0xaa, 0x16, 0x9c, 0x1e,
+  0xa9, 0xd2, 0xff, 0x54, 0x3c, 0x25, 0x27, 0x9e,
+  0x16, 0xdc, 0xc3, 0xa3, 0x0f, 0x3f, 0xc5, 0xb3,
+  0xfe, 0xf5, 0xba, 0xea, 0xd5, 0x7c, 0xc3, 0xa7,
+  0xef, 0x06, 0xbf, 0x65, 0x4e, 0x9e, 0x0d, 0xb7,
+  0x6b, 0x3a, 0x7e, 0xca, 0xff, 0xc1, 0x41, 0xd1,
+  0xc7, 0xa6, 0x04, 0xd3, 0xed, 0x35, 0xd7, 0x65,
+  0x3a, 0x31, 0x19, 0x9e, 0x84, 0x0d, 0x88, 0x27,
+  0xff, 0xff, 0x59, 0x7c, 0x22, 0xbb, 0xef, 0xe0,
+  0xd1, 0xf9, 0x5d, 0xb4, 0xe1, 0x79, 0xd3, 0xea,
+  0x36, 0x1f, 0x7e, 0x74, 0xfd, 0xb7, 0x0f, 0xda,
+  0x98, 0x74, 0xff, 0x83, 0xcf, 0xbd, 0xb0, 0x7d,
+  0x53, 0xa7, 0xfd, 0xd9, 0xf2, 0x87, 0x6d, 0x9a,
+  0xce, 0x87, 0x9f, 0xdf, 0xc7, 0xb3, 0xff, 0x97,
+  0x29, 0xbd, 0x96, 0xe0, 0xbf, 0x54, 0xe9, 0xd5,
+  0xb3, 0x0e, 0x8b, 0x9f, 0x2e, 0x89, 0x33, 0xf6,
+  0x95, 0xbd, 0x72, 0xe7, 0x4e, 0xff, 0xff, 0xca,
+  0x9f, 0xfd, 0x7f, 0x5e, 0xb6, 0xf6, 0xa6, 0xf1,
+  0x57, 0x94, 0xe2, 0xfe, 0x3c, 0x8a, 0xbd, 0x13,
+  0x61, 0xea, 0xb2, 0x31, 0xe7, 0xc5, 0x43, 0x0a,
+  0xb0, 0x84, 0x45, 0xe1, 0x9d, 0x36, 0xbc, 0x3a,
+  0x7d, 0xfd, 0xd6, 0x9f, 0xce, 0x9f, 0xcb, 0xc3,
+  0x6f, 0xfb, 0x62, 0xa6, 0xff, 0xf2, 0xa3, 0x63,
+  0xca, 0xfc, 0xca, 0x7a, 0xb7, 0xf6, 0xac, 0xa7,
+  0x1a, 0x49, 0xff, 0xda, 0x56, 0xbb, 0x02, 0xed,
+  0x65, 0xbd, 0x4e, 0x9f, 0xf5, 0xfc, 0x3d, 0xf3,
+  0x7d, 0xf2, 0xc7, 0x43, 0xd1, 0x1b, 0xe4, 0xc9,
+  0xf6, 0x51, 0x9e, 0x13, 0xa7, 0xeb, 0xa8, 0xed,
+  0x80, 0x74, 0xfe, 0xda, 0xca, 0x1f, 0xf5, 0x27,
+  0x4f, 0xff, 0xfb, 0xcc, 0xe0, 0xa5, 0xee, 0xff,
+  0x3c, 0xdb, 0x03, 0x36, 0xe7, 0x9e, 0x2f, 0x58,
+  0x54, 0x6d, 0x71, 0x5e, 0x86, 0x93, 0xff, 0xd9,
+  0x7a, 0xe3, 0x56, 0x56, 0xd9, 0x6b, 0x29, 0xd3,
+  0xff, 0xff, 0xef, 0x65, 0x35, 0xf6, 0x7f, 0xbb,
+  0x29, 0x7d, 0x7d, 0x7a, 0xfa, 0x9d, 0xb6, 0xd2,
+  0x83, 0xa0, 0x11, 0xbf, 0x75, 0x09, 0xbd, 0xf9,
+  0xd3, 0x6f, 0xf8, 0xe8, 0x68, 0xd8, 0x7c, 0x2f,
+  0x39, 0xfd, 0xb1, 0xd3, 0x7f, 0xf9, 0xd1, 0xe3,
+  0xd7, 0xa9, 0x1f, 0xe3, 0x93, 0xaf, 0xbf, 0xe2,
+  0x9c, 0x6c, 0x27, 0xff, 0xff, 0x5d, 0x76, 0xb6,
+  0x9d, 0xad, 0x9d, 0xb6, 0x60, 0x6b, 0xad, 0x70,
+  0x3e, 0x3a, 0x29, 0x45, 0x5f, 0x8b, 0xe7, 0xfb,
+  0x2f, 0x65, 0x1b, 0xe2, 0x1d, 0x39, 0x45, 0xa3,
+  0xa3, 0x13, 0xf8, 0xe8, 0xe1, 0x00, 0x93, 0x50,
+  0xd6, 0x7c, 0x19, 0x7e, 0x6f, 0x3a, 0x7f, 0xec,
+  0x11, 0xc6, 0xad, 0x95, 0xe0, 0x3a, 0x7f, 0x02,
+  0x8e, 0x89, 0x65, 0x3a, 0x7d, 0xed, 0x76, 0xe7,
+  0x9d, 0x3f, 0x79, 0x59, 0x46, 0x7e, 0x74, 0xdf,
+  0xfe, 0x74, 0x21, 0xf7, 0x89, 0x4f, 0xe5, 0xd3,
+  0xfd, 0x8d, 0x73, 0x5d, 0x4b, 0xea, 0x53, 0x8d,
+  0x74, 0xff, 0xec, 0x0f, 0xb2, 0xde, 0xa6, 0xb6,
+  0xd2, 0xa7, 0x4f, 0xc1, 0xdf, 0x6d, 0x80, 0x74,
+  0xfc, 0xcf, 0x6a, 0x60, 0xeb, 0x3a, 0x77, 0xff,
+  0xfe, 0x54, 0xff, 0xca, 0x21, 0xa7, 0x6f, 0xc6,
+  0x95, 0x87, 0x38, 0xbf, 0x8d, 0x5a, 0xa3, 0x26,
+  0xa1, 0x9b, 0x54, 0xab, 0xa6, 0x68, 0x59, 0xfa,
+  0x84, 0xee, 0x1a, 0x0f, 0x20, 0x94, 0xf3, 0xf2,
+  0x97, 0x9e, 0x41, 0x29, 0xd5, 0xf6, 0xc7, 0x90,
+  0x4a, 0x6f, 0xff, 0x3c, 0x82, 0x50, 0x88, 0xa6,
+  0x68, 0xa2, 0xe5, 0xff, 0x95, 0x4d, 0xd7, 0x2c,
+  0x82, 0x4e, 0x37, 0xd3, 0xf6, 0x5b, 0x30, 0x35,
+  0x9d, 0x3b, 0x83, 0xe0, 0x3d, 0xeb, 0x99, 0x4f,
+  0x6a, 0x67, 0x58, 0xe9, 0x66, 0xac, 0xf5, 0x7e,
+  0x32, 0x9f, 0xcd, 0x3f, 0x4a, 0x2f, 0xea, 0x0a,
+  0x9f, 0xde, 0x7e, 0x9d, 0x5b, 0x78, 0xe9, 0x3c,
+  0xa9, 0xdc, 0x34, 0x15, 0x05, 0x42, 0x9b, 0x54,
+  0x10, 0x60, 0xdc, 0xf0, 0x2f, 0xc8, 0x53, 0x8d,
+  0x64, 0x2a, 0x31, 0x72, 0x12, 0xb3, 0xda, 0x70,
+  0xbc, 0xe9, 0x30, 0xe9, 0xb1, 0xfb, 0x1b, 0x16,
+  0x88, 0x67, 0xdf, 0xe3, 0x5e, 0x61, 0xd3, 0xf2,
+  0x2b, 0x4f, 0x5f, 0x8a, 0x97, 0x8e, 0x9f, 0xea,
+  0x34, 0x7e, 0xd6, 0xd3, 0x80, 0xe9, 0xfb, 0xca,
+  0xca, 0x33, 0xf3, 0xa7, 0xd9, 0x43, 0x31, 0x87,
+  0x4e, 0xaf, 0x84, 0xe8, 0x03, 0xc2, 0xb9, 0x3c,
+  0xfc, 0x1d, 0xf7, 0xda, 0x54, 0xe9, 0xfb, 0xda,
+  0xf7, 0xab, 0x1d, 0xb2, 0x61, 0x98, 0x20, 0x27,
+  0x95, 0x70, 0xb9, 0x0c, 0x62, 0x7a, 0x7e, 0x29,
+  0x08, 0xce, 0x67, 0x83, 0x28, 0xd0, 0xe8, 0x7a,
+  0xbd, 0x8c, 0x2c, 0xb4, 0x3f, 0x41, 0x5e, 0xb2,
+  0x80, 0x6e, 0x6b, 0x3f, 0xfe, 0xa0, 0x47, 0x36,
+  0xe6, 0x5b, 0xae, 0x0a, 0xd1, 0xd3, 0xbf, 0xff,
+  0xf2, 0xa6, 0x7a, 0x94, 0xe2, 0xfe, 0x15, 0x12,
+  0xe2, 0xe7, 0x3f, 0x50, 0xd3, 0xdb, 0x83, 0x41,
+  0xd3, 0xd6, 0xea, 0x7f, 0x3a, 0x7d, 0x40, 0xf9,
+  0x58, 0x74, 0xff, 0xf2, 0xef, 0xb8, 0x2f, 0xdd,
+  0x7f, 0xb7, 0x83, 0xce, 0x8d, 0x56, 0x8d, 0x1f,
+  0x1a, 0x71, 0x1d, 0xc9, 0xe7, 0x3f, 0xc0, 0x74,
+  0xfd, 0x75, 0x68, 0x34, 0xa9, 0xd0, 0xf3, 0xc9,
+  0xb8, 0xdc, 0xed, 0x34, 0x6e, 0xce, 0x9b, 0x9c,
+  0xdd, 0x1b, 0x91, 0x2d, 0x55, 0x36, 0xd5, 0x40,
+  0x89, 0x65, 0x13, 0xd1, 0x0f, 0xd7, 0x90, 0xed,
+  0x18, 0x5e, 0x4a, 0xfc, 0xd6, 0xca, 0x82, 0xfe,
+  0x84, 0xc3, 0x50, 0xc3, 0x12, 0x36, 0x46, 0x01,
+  0x69, 0x60, 0xdc, 0x88, 0x05, 0x15, 0x94, 0xe5,
+  0x79, 0xdd, 0x4d, 0x21, 0xf5, 0xa9, 0x0f, 0x2d,
+  0xf0, 0x8b, 0x6f, 0x22, 0x9f, 0xfc, 0xe6, 0x73,
+  0xdd, 0x82, 0x9d, 0xc8, 0x68, 0xa2, 0xa7, 0xf3,
+  0xb0, 0x53, 0xb9, 0x0d, 0x17, 0x44, 0xff, 0xce,
+  0xe7, 0xbb, 0x05, 0x3b, 0x90, 0xd1, 0x25, 0xcf,
+  0xe7, 0x60, 0xa7, 0x72, 0x1a, 0x2f, 0x28, 0x56,
+  0xf8, 0x8e, 0x82, 0x77, 0x9d, 0xe1, 0xda, 0x29,
+  0x34, 0x76, 0xc3, 0xbb, 0x43, 0x18, 0x2b, 0x93,
+  0x4a, 0xc7, 0x61, 0x75, 0x2d, 0x0e, 0xdb, 0x26,
+  0x4f, 0xfe, 0x73, 0x39, 0xee, 0xc1, 0x4e, 0xe4,
+  0x34, 0x4b, 0x33, 0xc9, 0xdc, 0x86, 0x88, 0xce,
+  0x7e, 0xf2, 0xb2, 0x8c, 0xfc, 0xe9, 0x81, 0xe7,
+  0x49, 0x87, 0x4f, 0xbc, 0x36, 0xe7, 0x09, 0xe9,
+  0xb0, 0xbb, 0x78, 0xac, 0xfd, 0xcf, 0xf0, 0xf0,
+  0x9d, 0x3a, 0xab, 0x49, 0xd0, 0x29, 0x88, 0x31,
+  0xf8, 0x13, 0x2e, 0x55, 0x3f, 0xf5, 0xfc, 0x3d,
+  0xf6, 0xea, 0x5e, 0xac, 0x3a, 0x7c, 0x0a, 0xfa,
+  0xf1, 0xd1, 0xe3, 0xec, 0x6c, 0x8f, 0x3f, 0xff,
+  0x7b, 0x6d, 0x2f, 0x5a, 0x5e, 0xa1, 0xf5, 0x77,
+  0x68, 0x07, 0x4f, 0xfd, 0x8c, 0xbf, 0xbf, 0xaa,
+  0xdb, 0xb5, 0x67, 0x4f, 0xfa, 0xcb, 0xeb, 0x79,
+  0x41, 0xad, 0x0e, 0x93, 0xb1, 0x3b, 0x56, 0xa1,
+  0x51, 0xc4, 0x80, 0xc5, 0x54, 0x89, 0xff, 0xce,
+  0x67, 0x3d, 0xd8, 0x29, 0xdc, 0x86, 0x89, 0xa6,
+  0x7f, 0xf3, 0x99, 0xcf, 0x76, 0x0a, 0x77, 0x21,
+  0xa2, 0x71, 0x9f, 0xfc, 0xe6, 0x73, 0xdd, 0x82,
+  0x9d, 0xc8, 0x68, 0xa0, 0x67, 0xc2, 0x9d, 0xc8,
+  0x68, 0xb8, 0x26, 0x5f, 0x1d, 0x3f, 0x81, 0xeb,
+  0xed, 0xb1, 0x87, 0x49, 0xd8, 0x7e, 0xf6, 0x30,
+  0xd0, 0x56, 0x7f, 0x79, 0xdb, 0xd7, 0xec, 0xfc,
+  0xe9, 0xfe, 0x7b, 0xb0, 0x53, 0xb9, 0x0d, 0x12,
+  0x4c, 0x9d, 0x63, 0xf7, 0xe3, 0x68, 0xa1, 0x76,
+  0xad, 0xf2, 0xc5, 0xd1, 0x51, 0xa5, 0x2f, 0x94,
+  0xab, 0x0c, 0x9b, 0xc2, 0xb2, 0x7f, 0xda, 0xf9,
+  0xd8, 0x29, 0xdc, 0x86, 0x8b, 0x52, 0x7f, 0xdc,
+  0xf7, 0x60, 0xa7, 0x72, 0x1a, 0x25, 0x58, 0x3a,
+  0x4e, 0xd6, 0x89, 0x86, 0x24, 0x37, 0xa3, 0x4f,
+  0xe7, 0x60, 0xa7, 0x72, 0x1a, 0x22, 0x99, 0xfc,
+  0xec, 0x14, 0xee, 0x43, 0x44, 0x69, 0x3f, 0x9d,
+  0x82, 0x9d, 0xc8, 0x68, 0xa7, 0xe7, 0xff, 0x39,
+  0x9c, 0xf7, 0x60, 0xa7, 0x72, 0x1a, 0x26, 0xa9,
+  0xfc, 0xec, 0x14, 0xee, 0x43, 0x45, 0x77, 0x3c,
+  0x9d, 0xc8, 0x68, 0xaf, 0xa7, 0x7f, 0xff, 0xe5,
+  0x48, 0x0a, 0x71, 0x7f, 0x02, 0x7d, 0x0c, 0x4a,
+  0x9c, 0xf5, 0xa4, 0xe9, 0xff, 0x65, 0xbf, 0xeb,
+  0xd5, 0x72, 0x83, 0xa7, 0xfd, 0xde, 0x1c, 0xa3,
+  0xcf, 0xcd, 0x8e, 0x93, 0xb1, 0x17, 0x2d, 0x10,
+  0x80, 0xe5, 0x4f, 0xa7, 0xff, 0x39, 0x9c, 0xf7,
+  0x60, 0xa7, 0x72, 0x1a, 0x27, 0xb9, 0xfc, 0xec,
+  0x14, 0xee, 0x43, 0x45, 0xc3, 0x3f, 0xf3, 0xb9,
+  0xee, 0xc1, 0x4e, 0xe4, 0x34, 0x49, 0xf0, 0xaa,
+  0xed, 0x68, 0x3b, 0x79, 0xde, 0xb3, 0xb4, 0x3b,
+  0x69, 0x48, 0x63, 0x5c, 0xb2, 0x15, 0x54, 0x9b,
+  0x1d, 0xcf, 0xe7, 0x60, 0xa7, 0x72, 0x1a, 0x22,
+  0xa9, 0xfc, 0xec, 0x14, 0xee, 0x43, 0x45, 0x33,
+  0x3f, 0xf9, 0xcc, 0xe7, 0xbb, 0x05, 0x3b, 0x90,
+  0xd1, 0x33, 0xcf, 0xfe, 0x73, 0x39, 0xee, 0xc1,
+  0x4e, 0xe4, 0x34, 0x51, 0xb1, 0x42, 0x63, 0x5b,
+  0x1d, 0xeb, 0x3b, 0xba, 0x94, 0xff, 0xce, 0xe7,
+  0xbb, 0x05, 0x3b, 0x90, 0xd1, 0x1d, 0x4f, 0xde,
+  0xc0, 0xdb, 0x28, 0x3a, 0x7c, 0x29, 0xdc, 0x86,
+  0x8a, 0x6a, 0x7e, 0xf2, 0xb2, 0x8c, 0xfc, 0xe9,
+  0xff, 0xec, 0xbd, 0xb1, 0xe3, 0xc1, 0x7b, 0x73,
+  0xce, 0x99, 0x7e, 0x3a, 0x7f, 0xab, 0xd4, 0xaa,
+  0x79, 0x1c, 0x28, 0x90, 0x02, 0xed, 0xe9, 0x92,
+  0x76, 0xc9, 0xa5, 0x61, 0x6d, 0xe1, 0x81, 0x3e,
+  0x14, 0xee, 0x43, 0x45, 0x55, 0x3f, 0xee, 0x7b,
+  0xb0, 0x53, 0xb9, 0x0d, 0x13, 0x6c, 0x9d, 0x87,
+  0xec, 0xc3, 0x09, 0xfc, 0xec, 0x14, 0xee, 0x43,
+  0x45, 0x7f, 0x3f, 0x9d, 0x82, 0x9d, 0xc8, 0x68,
+  0xb1, 0xa7, 0xc2, 0x9d, 0xc8, 0x68, 0xb5, 0x67,
+  0xfd, 0xcf, 0x76, 0x0a, 0x77, 0x21, 0xa2, 0x82,
+  0x93, 0xb0, 0xfd, 0x98, 0x61, 0x3f, 0x9d, 0x82,
+  0x9d, 0xc8, 0x68, 0xb8, 0xa7, 0xf3, 0xb0, 0x53,
+  0xb9, 0x0d, 0x17, 0x4c, 0xff, 0xfe, 0x5b, 0x06,
+  0x9d, 0xab, 0xc7, 0xdb, 0x35, 0xe6, 0xcd, 0x68,
+  0x74, 0xff, 0x9f, 0x82, 0x3c, 0xfa, 0x33, 0xf3,
+  0xa7, 0x07, 0x38, 0x51, 0x4b, 0x76, 0x89, 0xff,
+  0x0a, 0xd3, 0x6e, 0xad, 0xd7, 0xf3, 0xa7, 0xed,
+  0x50, 0x32, 0xdd, 0x73, 0xa7, 0xef, 0xb9, 0xa7,
+  0xfa, 0xe7, 0x4f, 0xff, 0xfb, 0x5a, 0xed, 0x6c,
+  0xa6, 0xe1, 0xd6, 0xfb, 0xab, 0x5e, 0x14, 0x3a,
+  0x79, 0x3b, 0x90, 0xd1, 0x26, 0x4f, 0xf0, 0xe5,
+  0x37, 0xbf, 0x3e, 0xa7, 0x40, 0x9f, 0x1b, 0x0a,
+  0xe7, 0xed, 0xbe, 0xd5, 0x2b, 0xf6, 0xa1, 0xd3,
+  0xec, 0xbf, 0x99, 0xc7, 0x4f, 0xff, 0xb9, 0x05,
+  0x6c, 0x19, 0x7c, 0x77, 0xff, 0xfe, 0x54, 0x3c,
+  0xfe, 0xae, 0x4d, 0x3f, 0xfb, 0x40, 0xeb, 0xa8,
+  0xd6, 0xca, 0x17, 0x3a, 0x77, 0xff, 0xfe, 0x54,
+  0xfc, 0x3d, 0x43, 0x3d, 0x52, 0x9c, 0x5f, 0xcf,
+  0xb1, 0x83, 0x9a, 0xb3, 0xa7, 0xfc, 0xc5, 0x4b,
+  0x06, 0x97, 0x5a, 0x9d, 0x3f, 0xd9, 0xdf, 0x6e,
+  0xcd, 0xb9, 0xe7, 0x4f, 0xfe, 0xea, 0x2d, 0xe5,
+  0x0c, 0x6b, 0xc3, 0xe3, 0xa3, 0x11, 0x81, 0x73,
+  0xdf, 0xce, 0xa7, 0xc1, 0x96, 0xeb, 0x9d, 0x3f,
+  0xe7, 0xa8, 0x51, 0xbc, 0x43, 0x47, 0x9d, 0x1a,
+  0xb3, 0xe5, 0x68, 0x96, 0x7a, 0xf4, 0x66, 0xc7,
+  0x4f, 0xf7, 0xb5, 0xef, 0x1f, 0x99, 0xea, 0x9d,
+  0x0d, 0x1f, 0x0e, 0xa1, 0x1c, 0xef, 0xff, 0xfc,
+  0xe9, 0xff, 0xf6, 0x32, 0xe0, 0xbf, 0x66, 0xd5,
+  0xc6, 0x2a, 0x14, 0xe2, 0xfe, 0x31, 0x32, 0xff,
+  0x42, 0x22, 0xc8, 0xb3, 0xf5, 0x97, 0x72, 0x7a,
+  0x83, 0xa7, 0xe1, 0xe1, 0x05, 0x79, 0xd1, 0xb1,
+  0xec, 0x09, 0x7c, 0xcf, 0x73, 0x71, 0x78, 0x8d,
+  0x4c, 0x1e, 0x5f, 0x90, 0xd0, 0xd6, 0x43, 0x4c,
+  0x2c, 0xda, 0x22, 0xe6, 0x60, 0x3c, 0xac, 0x3a,
+  0x6f, 0x1e, 0x26, 0xf8, 0x46, 0xcf, 0xb1, 0x83,
+  0x9a, 0xb3, 0xa7, 0xfe, 0xcb, 0x02, 0xd1, 0xbe,
+  0xd6, 0xed, 0x59, 0xd3, 0xf7, 0x23, 0xbf, 0xff,
+  0xf3, 0xa4, 0xe4, 0x64, 0x04, 0x09, 0x97, 0x4f,
+  0x30, 0x84, 0x35, 0x2a, 0x52, 0xd9, 0x26, 0x1e,
+  0xcd, 0x11, 0xda, 0x39, 0x6a, 0x61, 0x64, 0x24,
+  0xec, 0x3b, 0xfa, 0x16, 0x35, 0x27, 0xb9, 0xde,
+  0x94, 0x8e, 0x89, 0xfc, 0xec, 0x14, 0xee, 0x43,
+  0x44, 0x6b, 0x3e, 0x14, 0xee, 0x43, 0x45, 0x4b,
+  0x37, 0x21, 0xa2, 0x1a, 0x93, 0xb0, 0xf4, 0x78,
+  0xc2, 0x7f, 0xe7, 0x73, 0xdd, 0x82, 0x9d, 0xc8,
+  0x68, 0x8f, 0xa7, 0xf3, 0xb0, 0x53, 0xb9, 0x0d,
+  0x16, 0x3c, 0xfd, 0xaa, 0x06, 0x5b, 0xae, 0x74,
+  0xff, 0x07, 0x7d, 0x5e, 0xbd, 0xf8, 0xe9, 0xef,
+  0x99, 0xe1, 0x3a, 0x7f, 0xff, 0x94, 0x43, 0x36,
+  0xcb, 0x5b, 0xc9, 0x6f, 0x5e, 0xbd, 0x49, 0xd1,
+  0xe4, 0x43, 0xd8, 0x8a, 0x77, 0x72, 0x1a, 0x2d,
+  0x09, 0xff, 0x77, 0xed, 0xe9, 0xc3, 0x46, 0x7e,
+  0x74, 0x85, 0x0f, 0x9c, 0x49, 0xa7, 0xe6, 0xdb,
+  0xee, 0x0b, 0xf1, 0xd3, 0xe5, 0xbe, 0x59, 0x4e,
+  0x9f, 0xfe, 0xcb, 0xd7, 0x1a, 0xb2, 0xb6, 0xcb,
+  0x59, 0x4e, 0x8a, 0x0f, 0xd4, 0x09, 0x61, 0x51,
+  0x91, 0x90, 0xa6, 0x9f, 0xfb, 0x2b, 0xed, 0x01,
+  0xe2, 0xb9, 0xb1, 0xd3, 0xeb, 0xdb, 0x83, 0x59,
+  0xd3, 0xfc, 0x1a, 0x51, 0xb5, 0xb0, 0x14, 0xe9,
+  0x83, 0x30, 0xf8, 0x50, 0xa2, 0x7f, 0x65, 0x9a,
+  0xf5, 0xbc, 0xc3, 0xa7, 0xf3, 0xf0, 0x6a, 0x0b,
+  0x41, 0xd3, 0xdb, 0x65, 0xb8, 0xe9, 0xfe, 0xcc,
+  0xff, 0x11, 0x33, 0xf3, 0xa3, 0x11, 0x79, 0x49,
+  0xa7, 0x18, 0xd4, 0x86, 0x7b, 0x2d, 0xd7, 0x3a,
+  0x7f, 0x6b, 0xf0, 0x68, 0xfc, 0xa9, 0xd2, 0x73,
+  0x71, 0x72, 0x99, 0x4c, 0x36, 0x85, 0xf6, 0x42,
+  0x2a, 0xd0, 0xed, 0x02, 0x6a, 0xc2, 0x92, 0xf0,
+  0xe6, 0xd4, 0x3c, 0xde, 0x41, 0x3f, 0x37, 0xfb,
+  0x60, 0x56, 0x8e, 0x9e, 0xcb, 0x75, 0xce, 0x96,
+  0xa9, 0x87, 0xa2, 0x06, 0x33, 0xe1, 0x4e, 0xe4,
+  0x34, 0x5a, 0xd3, 0xfe, 0xe7, 0xbb, 0x05, 0x3b,
+  0x90, 0xd1, 0x41, 0xc9, 0xcd, 0xc4, 0x50, 0xe1,
+  0x5b, 0x0c, 0x27, 0xff, 0x39, 0x9c, 0xf7, 0x60,
+  0xa7, 0x72, 0x1a, 0x28, 0xb9, 0xfc, 0xec, 0x14,
+  0xee, 0x43, 0x45, 0xd5, 0x0f, 0x64, 0x25, 0xa4,
+  0x23, 0x3c, 0x4c, 0xc4, 0xcb, 0x4e, 0x70, 0xfd,
+  0x1d, 0x35, 0x4e, 0x6e, 0xa5, 0x3e, 0x14, 0xee,
+  0x43, 0x44, 0x43, 0x3a, 0xd9, 0xb1, 0xd2, 0x76,
+  0x1e, 0x65, 0x26, 0x13, 0xf9, 0xd8, 0x29, 0xdc,
+  0x86, 0x88, 0xda, 0x7f, 0x3b, 0x05, 0x3b, 0x90,
+  0xd1, 0x4d, 0xcf, 0xe7, 0x60, 0xa7, 0x72, 0x1a,
+  0x2a, 0x09, 0xfc, 0xec, 0x14, 0xee, 0x43, 0x45,
+  0x4d, 0x3e, 0x14, 0xee, 0x43, 0x45, 0x61, 0x3e,
+  0xf7, 0xfb, 0x68, 0x27, 0x4f, 0xf3, 0xdd, 0x82,
+  0x9d, 0xc8, 0x68, 0x8f, 0xe7, 0x62, 0xd0, 0x74,
+  0x9d, 0x88, 0xb6, 0x43, 0x0e, 0x2a, 0x04, 0x19,
+  0xff, 0xce, 0x67, 0x3d, 0xd8, 0x29, 0xdc, 0x86,
+  0x89, 0xbe, 0x7f, 0xe6, 0x73, 0xdd, 0x82, 0x9d,
+  0xc8, 0x68, 0x9f, 0xa7, 0xe6, 0xeb, 0xaa, 0xf5,
+  0x4d, 0x4c, 0xa4, 0xe9, 0xff, 0xe5, 0x55, 0x55,
+  0x55, 0x55, 0x5a, 0x6a, 0x74, 0xf8, 0x7d, 0x47,
+  0x30, 0xa9, 0xbf, 0xfc, 0xa8, 0xc3, 0x7f, 0xf9,
+  0x3c, 0xb4, 0x29, 0xc6, 0x86, 0x15, 0x19, 0x55,
+  0x85, 0x4c, 0xfc, 0x3c, 0x96, 0xf0, 0x9d, 0x3d,
+  0x43, 0x3c, 0xf3, 0xa7, 0xd5, 0x0d, 0x39, 0xe7,
+  0x4f, 0xeb, 0x2b, 0x1d, 0xf7, 0xca, 0x74, 0x85,
+  0x4f, 0xfb, 0x08, 0xfc, 0x4f, 0x3b, 0xea, 0xe1,
+  0xd3, 0xff, 0x6c, 0xb7, 0xea, 0xe5, 0xad, 0xe6,
+  0x1d, 0x3a, 0xfe, 0x68, 0xe8, 0x53, 0xe1, 0xaa,
+  0x24, 0x2a, 0x73, 0xfe, 0x27, 0x18, 0x54, 0x01,
+  0x95, 0xdf, 0x67, 0xb9, 0xad, 0xec, 0x3a, 0x6e,
+  0x03, 0xa0, 0x4d, 0xc3, 0x09, 0x27, 0x7f, 0xff,
+  0xe7, 0x4f, 0x50, 0x1e, 0x52, 0x9c, 0x5f, 0xcf,
+  0x53, 0x7f, 0x21, 0xd0, 0xa8, 0x91, 0xb1, 0xfe,
+  0x86, 0x13, 0xff, 0x51, 0xa7, 0xd8, 0x1a, 0x34,
+  0xb7, 0xe3, 0xa7, 0x96, 0xf5, 0x43, 0x44, 0x1d,
+  0x3f, 0x75, 0x97, 0x57, 0xa3, 0xce, 0x81, 0x45,
+  0x2d, 0xd1, 0xdb, 0x16, 0xcc, 0x3b, 0x1d, 0x37,
+  0xff, 0x9d, 0x0f, 0x35, 0xdf, 0x8b, 0x4f, 0x55,
+  0x7c, 0xd8, 0xa7, 0x1a, 0x29, 0xf5, 0x77, 0xed,
+  0xf5, 0x4e, 0x8f, 0x1e, 0xfe, 0xf3, 0x39, 0xdf,
+  0xff, 0xf9, 0x50, 0x53, 0x8b, 0xf9, 0xef, 0x7f,
+  0xe6, 0x8a, 0x84, 0x37, 0xbe, 0x19, 0x8f, 0x27,
+  0x01, 0x68, 0x70, 0x04, 0x20, 0x27, 0x07, 0xaa,
+  0x74, 0xf6, 0xdc, 0x1f, 0x1d, 0x3f, 0xf2, 0x87,
+  0xc0, 0xb4, 0xb4, 0xa1, 0xf1, 0xd1, 0xe4, 0x40,
+  0xfc, 0x37, 0x52, 0x29, 0xf9, 0xa5, 0xc1, 0xb7,
+  0x8e, 0x9f, 0xaf, 0x8d, 0x02, 0xb0, 0xf1, 0x01,
+  0x4f, 0xb8, 0x36, 0xb2, 0x9a, 0x20, 0x27, 0x1b,
+  0x99, 0xf2, 0xfd, 0xea, 0x6a, 0x74, 0xfe, 0x16,
+  0xab, 0xe0, 0xbf, 0x8e, 0x9e, 0xa7, 0xe1, 0x52,
+  0xa6, 0xff, 0xf2, 0xa1, 0x4d, 0xd7, 0xe4, 0x53,
+  0xf7, 0x0b, 0xde, 0x1e, 0x29, 0xc6, 0x86, 0x15,
+  0x3c, 0xbc, 0x31, 0xf3, 0x28, 0x21, 0xdc, 0xa7,
+  0x48, 0x47, 0x4f, 0xb4, 0xbe, 0x9d, 0xbc, 0xd1,
+  0x03, 0xcf, 0xfa, 0xda, 0x50, 0xbb, 0x96, 0xeb,
+  0xb1, 0xd3, 0xb8, 0x68, 0x3a, 0x6f, 0xff, 0x3a,
+  0x7f, 0x0f, 0xb1, 0xb6, 0xf7, 0xb9, 0x0d, 0x9f,
+  0xe3, 0x71, 0xb2, 0x30, 0x85, 0xd6, 0x7f, 0xe0,
+  0xcd, 0x76, 0xe7, 0xef, 0xea, 0x54, 0xe8, 0x53,
+  0xe9, 0xc2, 0x39, 0xff, 0xd8, 0xc6, 0x73, 0xf0,
+  0x53, 0xb9, 0x0d, 0x10, 0xc4, 0x58, 0xfc, 0x40,
+  0x82, 0x7e, 0xc1, 0x4e, 0xe4, 0x34, 0x41, 0x53,
+  0xd7, 0xaa, 0xfc, 0x54, 0xee, 0x1a, 0x0a, 0x9e,
+  0xd0, 0x3b, 0x59, 0x53, 0xfb, 0xd4, 0x65, 0xea,
+  0xbf, 0x15, 0x05, 0x4f, 0xd8, 0x8b, 0x65, 0x61,
+  0x53, 0x7f, 0xf9, 0x53, 0xf0, 0x28, 0x51, 0xe1,
+  0x2a, 0x31, 0x30, 0xb4, 0x22, 0x60, 0xdd, 0x88,
+  0xfe, 0x34, 0x00, 0xaf, 0xca, 0xb7, 0x8c, 0x4d,
+  0xe1, 0x29, 0xc7, 0xe7, 0x2e, 0x7a, 0x7b, 0x36,
+  0x8e, 0xce, 0x7f, 0xca, 0xfe, 0x0c, 0xa8, 0xad,
+  0x4e, 0x9f, 0xeb, 0xd9, 0x5b, 0x6c, 0xbf, 0x29,
+  0xd3, 0xfc, 0xb4, 0xbf, 0x51, 0x53, 0x18, 0x74,
+  0x29, 0xfa, 0xd8, 0xee, 0x7f, 0xfe, 0x6b, 0xb9,
+  0xfd, 0x6d, 0xd9, 0x46, 0x97, 0xd3, 0xb7, 0x9a,
+  0x2f, 0xb9, 0xf7, 0xae, 0x18, 0xf3, 0xa7, 0xfc,
+  0x1e, 0x7d, 0xed, 0x83, 0xea, 0x9d, 0x3f, 0xaf,
+  0xf6, 0xf0, 0x7d, 0xb0, 0xf1, 0x00, 0xce, 0xe1,
+  0x79, 0xe2, 0x01, 0x8c, 0x3e, 0x9d, 0x10, 0xa6,
+  0xe7, 0x9e, 0x20, 0x19, 0xee, 0x0a, 0x5e, 0x78,
+  0x80, 0x67, 0xf7, 0x92, 0xd9, 0xf7, 0xca, 0x78,
+  0x80, 0x67, 0x78, 0x36, 0x3c, 0x40, 0x31, 0xb2,
+  0x2e, 0x58, 0x45, 0x62, 0xe6, 0xc8, 0x13, 0x85,
+  0x6e, 0x78, 0x80, 0x60, 0xf1, 0x00, 0xcc, 0xac,
+  0x3c, 0x40, 0x31, 0xb1, 0xb9, 0xf0, 0xbc, 0xf7,
+  0x99, 0xb2, 0x9e, 0x20, 0x19, 0xd7, 0xe4, 0x3c,
+  0x40, 0x33, 0xfe, 0x0e, 0x7b, 0xad, 0xe4, 0xe1,
+  0x3c, 0x40, 0x33, 0x76, 0xc7, 0x88, 0x06, 0x7f,
+  0x07, 0x7f, 0x5a, 0xaf, 0xc7, 0x88, 0x06, 0x7d,
+  0xed, 0x7c, 0x1f, 0x1e, 0x20, 0x19, 0xbd, 0x53,
+  0xc4, 0x03, 0x02, 0x7b, 0x37, 0x36, 0x9f, 0x5c,
+  0x16, 0x97, 0x9a, 0x20, 0x19, 0xbe, 0x53, 0xc4,
+  0x02, 0xe3, 0x69, 0x3e, 0xf2, 0xb3, 0xb6, 0x3c,
+  0x40, 0x33, 0xda, 0x70, 0x21, 0xe2, 0x01, 0x9c,
+  0xa2, 0x87, 0x88, 0x06, 0x7f, 0xd9, 0x4d, 0x76,
+  0x5c, 0x0f, 0xaa, 0x78, 0x80, 0x67, 0xda, 0x73,
+  0xde, 0xa7, 0x88, 0x06, 0x31, 0x10, 0x16, 0x4c,
+  0x98, 0x7e, 0x3c, 0x40, 0x30, 0xf5, 0x52, 0x1b,
+  0x11, 0xe4, 0x26, 0x7c, 0xab, 0x63, 0x3f, 0x8d,
+  0x2a, 0x5b, 0x78, 0x53, 0x68, 0x45, 0x3e, 0xcb,
+  0xd7, 0xa9, 0x3c, 0x40, 0x33, 0xfb, 0x65, 0x46,
+  0x85, 0x6e, 0x78, 0x80, 0x76, 0x36, 0x93, 0x85,
+  0x7f, 0x3c, 0x40, 0x30, 0x87, 0xf0, 0x2a, 0x13,
+  0xde, 0x07, 0xd4, 0xf1, 0x00, 0xcf, 0xdc, 0xd3,
+  0xf2, 0x97, 0x9e, 0x20, 0x18, 0xc4, 0x44, 0xfc,
+  0x41, 0xa1, 0x74, 0xff, 0x59, 0x6a, 0xea, 0xe8,
+  0x3f, 0x1e, 0x20, 0x19, 0x78, 0xf1, 0x00, 0xcd,
+  0xd4, 0x6c, 0x7c, 0x96, 0x47, 0x98, 0x7e, 0x3c,
+  0x40, 0x33, 0xee, 0xbd, 0x7d, 0x49, 0xe2, 0x01,
+  0x9f, 0xbc, 0x1a, 0x3f, 0x2a, 0x78, 0x80, 0x61,
+  0x51, 0x24, 0x04, 0x77, 0x35, 0x8d, 0x99, 0x02,
+  0x19, 0x0d, 0xb6, 0x90, 0x05, 0x82, 0xc4, 0x5c,
+  0x5f, 0xf1, 0x3d, 0x65, 0x6c, 0x5e, 0x3c, 0x1d,
+  0x48, 0x4a, 0xef, 0x86, 0x0c, 0xee, 0xe4, 0x34,
+  0x40, 0x2e, 0x45, 0xec, 0xf6, 0xbd, 0x55, 0xd9,
+  0x87, 0x4d, 0xf2, 0x95, 0x2d, 0x65, 0x4e, 0xb2,
+  0xd0, 0x74, 0xdf, 0xfe, 0x54, 0x78, 0xf7, 0x35,
+  0x62, 0xcd, 0x09, 0x7e, 0x39, 0x39, 0x9e, 0xa9,
+  0x4e, 0x3c, 0x29, 0xeb, 0xd5, 0xbf, 0x43, 0xa2,
+  0x86, 0x57, 0x73, 0xc9, 0x92, 0x92, 0xe7, 0xe3,
+  0x8f, 0xa1, 0x95, 0xbc, 0xb6, 0x7e, 0x16, 0x9e,
+  0xa3, 0x41, 0xd3, 0xfe, 0x7d, 0x77, 0x06, 0x31,
+  0x47, 0x59, 0xd3, 0xff, 0x0d, 0xbb, 0x1e, 0xa3,
+  0xf6, 0xf6, 0x1d, 0x3f, 0x6f, 0xfc, 0x7d, 0x96,
+  0x2a, 0x79, 0xab, 0x73, 0x47, 0x4f, 0xb1, 0xa7,
+  0xad, 0x27, 0x4f, 0x60, 0x2b, 0xca, 0x81, 0x3e,
+  0xa0, 0x23, 0x6f, 0x28, 0x85, 0x4d, 0xeb, 0x0b,
+  0x7c, 0x81, 0x64, 0x4e, 0x84, 0xcc, 0xf7, 0x82,
+  0xf5, 0x3a, 0x76, 0x8d, 0xdd, 0x4e, 0x9f, 0xfb,
+  0xe6, 0x62, 0x5b, 0xdb, 0x5b, 0x4d, 0x67, 0x4f,
+  0xfd, 0x7a, 0xe6, 0xcb, 0x4d, 0x72, 0x9b, 0x9d,
+  0x0a, 0x8b, 0x1f, 0x11, 0x72, 0x4c, 0xfb, 0x9b,
+  0x6d, 0xb2, 0x9d, 0x35, 0x6a, 0x74, 0xef, 0xff,
+  0xfc, 0xe9, 0xbe, 0xe2, 0x9c, 0x5f, 0xc0, 0x9e,
+  0xd5, 0x4d, 0x67, 0x77, 0xd8, 0x54, 0x3d, 0x18,
+  0x0c, 0x84, 0x26, 0xa1, 0x0c, 0xfe, 0xb8, 0x65,
+  0x3f, 0x6f, 0x79, 0xd3, 0xfc, 0x18, 0xdb, 0x1d,
+  0xff, 0xff, 0x95, 0x39, 0x9d, 0x73, 0xa2, 0xc7,
+  0xae, 0xd8, 0xf2, 0x15, 0x1d, 0x3e, 0x38, 0xe8,
+  0x46, 0xcd, 0x6e, 0x3a, 0x66, 0xaa, 0x74, 0xfc,
+  0xec, 0x6d, 0xe0, 0xdb, 0x0d, 0x66, 0xf1, 0x59,
+  0xed, 0xb2, 0xdc, 0x74, 0xff, 0xcb, 0x80, 0xfb,
+  0x60, 0x02, 0xfe, 0x74, 0xbc, 0x28, 0xa8, 0x04,
+  0x7b, 0x90, 0xc5, 0x0d, 0xb2, 0x03, 0xe3, 0xd4,
+  0xda, 0x3f, 0xad, 0x65, 0xe9, 0x0a, 0xff, 0x10,
+  0x8d, 0x2d, 0x72, 0xd1, 0xf3, 0x7c, 0x9a, 0x10,
+  0xd2, 0xbc, 0x7a, 0xed, 0xa3, 0x07, 0x9f, 0xec,
+  0x10, 0x5b, 0xbf, 0x2c, 0x74, 0xfc, 0x1f, 0x66,
+  0xdc, 0xf3, 0xa7, 0xdb, 0xda, 0x7a, 0xea, 0xca,
+  0x85, 0x44, 0x86, 0x1a, 0xef, 0x2d, 0x9f, 0xfc,
+  0x3a, 0xc3, 0x4e, 0xdf, 0x95, 0xf2, 0x81, 0xd2,
+  0xde, 0x68, 0x81, 0x65, 0x73, 0x50, 0x29, 0x2f,
+  0x5c, 0xde, 0x7e, 0x3f, 0x3f, 0xef, 0x6a, 0x5b,
+  0xdb, 0xdd, 0xf7, 0xca, 0x54, 0xff, 0xeb, 0xd7,
+  0xa9, 0xdc, 0xc5, 0xc0, 0xbe, 0xa1, 0xd0, 0xa8,
+  0x94, 0xf2, 0x34, 0xea, 0x01, 0xe7, 0x42, 0xa7,
+  0x02, 0xc8, 0x43, 0xda, 0x17, 0x9a, 0x11, 0x4f,
+  0xe7, 0xb5, 0x81, 0xd6, 0xc3, 0xa7, 0xff, 0x0a,
+  0x06, 0x36, 0x0c, 0x51, 0x5a, 0x9d, 0x3f, 0xb9,
+  0xab, 0x63, 0x32, 0xa7, 0x46, 0x1f, 0xbb, 0x64,
+  0x59, 0xfb, 0xda, 0xef, 0x98, 0xc3, 0xa7, 0xd9,
+  0xb7, 0x86, 0xa7, 0x4f, 0xff, 0x56, 0xf4, 0xa7,
+  0xad, 0xb9, 0xbf, 0x2d, 0xe6, 0x1d, 0x25, 0xa0,
+  0xff, 0x7f, 0x27, 0x8f, 0x23, 0xde, 0xc4, 0x77,
+  0x85, 0x5c, 0xed, 0xb8, 0x4e, 0x9f, 0x7d, 0xc1,
+  0x8d, 0xe7, 0x42, 0x9e, 0x26, 0x83, 0x73, 0xca,
+  0xca, 0x5a, 0x3a, 0x15, 0x52, 0xeb, 0xe3, 0x9f,
+  0xab, 0xcd, 0xc8, 0xa7, 0xbe, 0xea, 0x6a, 0x74,
+  0xdf, 0xfe, 0x74, 0x54, 0xdd, 0xfe, 0x47, 0x3f,
+  0x57, 0xd6, 0xec, 0xb1, 0x4e, 0x34, 0x53, 0xbf,
+  0xff, 0xf2, 0xa7, 0x9f, 0x7c, 0x42, 0x9c, 0x5f,
+  0xcf, 0xb3, 0x6f, 0x7d, 0x53, 0xa5, 0xc2, 0x7b,
+  0x00, 0x5f, 0x3f, 0x05, 0x35, 0x6b, 0x2e, 0x74,
+  0xfa, 0x8d, 0x5f, 0xb2, 0x93, 0xa7, 0xde, 0xaa,
+  0xd0, 0xc3, 0xe5, 0xfb, 0x3e, 0x5e, 0x1f, 0xb4,
+  0x3e, 0x5f, 0xb3, 0x73, 0xcf, 0x97, 0xec, 0xf6,
+  0x8f, 0xca, 0x9f, 0x2f, 0xd8, 0xd8, 0xf4, 0x40,
+  0x8a, 0x7c, 0xb9, 0x5c, 0x03, 0xe5, 0xfb, 0x07,
+  0xcb, 0xf6, 0x6e, 0xb9, 0xf2, 0xfd, 0x61, 0x6f,
+  0x27, 0x81, 0xfc, 0xe8, 0x91, 0x3d, 0x9a, 0x9e,
+  0xf8, 0xf9, 0x7e, 0xc1, 0xf2, 0xfd, 0x9b, 0xe5,
+  0x3e, 0x5f, 0xb3, 0xfd, 0x9f, 0x70, 0xe3, 0x6c,
+  0xd8, 0xf9, 0x7e, 0xcf, 0xd9, 0x6f, 0x57, 0x4a,
+  0x0f, 0x97, 0xec, 0x7c, 0x8a, 0x50, 0x23, 0xaa,
+  0x34, 0xf0, 0xd0, 0xb7, 0x3e, 0x5f, 0xb0, 0x7c,
+  0xbf, 0x70, 0xd7, 0x4d, 0xff, 0xe7, 0xcb, 0xf6,
+  0x1e, 0xac, 0x53, 0x63, 0x5c, 0x84, 0x2d, 0x30,
+  0x9b, 0x12, 0x86, 0x19, 0x56, 0x17, 0x97, 0x5e,
+  0xfc, 0x9a, 0x7b, 0x1e, 0xba, 0xcb, 0x97, 0xeb,
+  0x91, 0x21, 0x3f, 0xec, 0x4d, 0xb0, 0x7f, 0xeb,
+  0x34, 0x74, 0xcf, 0xa0, 0xa8, 0xa1, 0x12, 0xd4,
+  0xa0, 0x81, 0xf4, 0x0a, 0xe4, 0xc7, 0x4e, 0x33,
+  0xcf, 0xff, 0xd4, 0xbc, 0x55, 0xb7, 0x34, 0xbb,
+  0x59, 0x59, 0xcd, 0x1d, 0x0a, 0xba, 0xeb, 0x84,
+  0xbd, 0x39, 0x8d, 0xa1, 0x64, 0xff, 0xb5, 0xad,
+  0x20, 0xb6, 0xb6, 0x88, 0x74, 0xfc, 0x1d, 0xae,
+  0xdc, 0xf3, 0xa7, 0x7f, 0xff, 0xe5, 0x4e, 0xde,
+  0xbf, 0x14, 0xe2, 0xfe, 0x7f, 0xc1, 0xcf, 0xde,
+  0x38, 0xdb, 0x84, 0xe9, 0xfe, 0x0e, 0xfb, 0x73,
+  0xd7, 0xea, 0x4e, 0x8d, 0x93, 0x33, 0x62, 0x07,
+  0xc9, 0x80, 0x5b, 0x73, 0xe9, 0xff, 0x00, 0x7b,
+  0x46, 0xee, 0xba, 0x8b, 0x73, 0xa7, 0x7f, 0xff,
+  0xe5, 0x88, 0x42, 0x7c, 0x29, 0xdc, 0x85, 0x88,
+  0x41, 0xc6, 0xb2, 0x77, 0xff, 0xfe, 0x58, 0x83,
+  0xe0, 0xb1, 0x07, 0xb8, 0xd6, 0x4c, 0xac, 0xc4,
+  0x49, 0xa3, 0x64, 0xfa, 0xeb, 0x75, 0x61, 0xd3,
+  0xc1, 0xe5, 0xd6, 0x74, 0xed, 0xeb, 0xf1, 0xd1,
+  0x41, 0xe0, 0x30, 0x8a, 0x7c, 0x8b, 0x65, 0x61,
+  0x53, 0xe0, 0xe0, 0x0c, 0x2a, 0x6c, 0x42, 0xa6,
+  0xff, 0xf2, 0xa3, 0x0f, 0xd2, 0xa4, 0xb7, 0x23,
+  0xfc, 0x52, 0x7f, 0x06, 0xf5, 0xfa, 0xd8, 0xde,
+  0x53, 0x8d, 0xe4, 0x2a, 0x70, 0x1e, 0x66, 0xe8,
+  0x69, 0xcf, 0xfe, 0xb2, 0xfd, 0x5c, 0xcd, 0xb8,
+  0x3b, 0x59, 0xd3, 0xfa, 0xbb, 0xd9, 0x5f, 0xfa,
+  0x93, 0xa1, 0x55, 0xd9, 0x62, 0x67, 0xa3, 0x05,
+  0x18, 0xeb, 0x38, 0xd2, 0xa9, 0x53, 0xbf, 0xff,
+  0xf2, 0xa7, 0xcf, 0xfb, 0x83, 0x62, 0x9c, 0x5f,
+  0xcf, 0xff, 0x05, 0x3b, 0xa9, 0xf9, 0x41, 0x3a,
+  0x80, 0xe3, 0xa7, 0xff, 0xb1, 0x5d, 0xb0, 0x2e,
+  0x89, 0x9a, 0xfc, 0x27, 0x4f, 0x37, 0xdb, 0xe6,
+  0xc7, 0x43, 0xcf, 0xdf, 0x93, 0xe7, 0xff, 0x3f,
+  0x07, 0xe6, 0x7a, 0xbb, 0xea, 0xb8, 0x74, 0xf7,
+  0xb6, 0xc6, 0x1d, 0x0a, 0x9c, 0x6b, 0xcd, 0xfa,
+  0x19, 0x00, 0x43, 0xa2, 0x5c, 0xfd, 0xab, 0xaf,
+  0x82, 0x97, 0x9d, 0x3f, 0xee, 0x1d, 0x4f, 0x5b,
+  0x3a, 0x9f, 0x8e, 0x9f, 0xf5, 0x6a, 0xa3, 0x75,
+  0x76, 0xde, 0x3a, 0x7f, 0xc1, 0xcd, 0x5b, 0x84,
+  0x7d, 0xb1, 0xd1, 0x88, 0xee, 0x43, 0x2f, 0x20,
+  0xb0, 0xfa, 0x79, 0xfb, 0xf1, 0xa3, 0xa7, 0xc3,
+  0xb6, 0x60, 0x1d, 0x3f, 0xf6, 0xaf, 0xd9, 0x65,
+  0x6d, 0x5b, 0x2d, 0x27, 0x47, 0x1f, 0x7d, 0x49,
+  0x67, 0xff, 0xb2, 0xf5, 0xc6, 0xac, 0xad, 0xb2,
+  0xd6, 0x53, 0xa7, 0xf5, 0xdb, 0xab, 0x40, 0xdd,
+  0x28, 0xd0, 0xe8, 0xd9, 0x16, 0x60, 0x43, 0x75,
+  0x09, 0xff, 0xef, 0x57, 0x36, 0xbd, 0x7d, 0xae,
+  0xdc, 0x1e, 0x3a, 0x7f, 0xff, 0x05, 0xf2, 0xde,
+  0x5b, 0xfb, 0xe5, 0x7b, 0xbf, 0xff, 0xf2, 0xa7,
+  0xb6, 0xcc, 0xd6, 0x54, 0xe7, 0x86, 0x86, 0x88,
+  0x66, 0x77, 0xff, 0xfe, 0x54, 0xec, 0x04, 0x29,
+  0xc5, 0xfc, 0xff, 0xb2, 0x8c, 0xdb, 0x9e, 0x0b,
+  0x41, 0xd1, 0xf1, 0xf3, 0x01, 0x44, 0xfe, 0x78,
+  0x65, 0xef, 0xa5, 0x07, 0x42, 0xa7, 0x17, 0x43,
+  0x25, 0x24, 0x63, 0x0a, 0xee, 0x22, 0x9e, 0xf5,
+  0xfc, 0xa7, 0x4f, 0xed, 0x30, 0x7e, 0xfb, 0xc0,
+  0x74, 0xff, 0xf9, 0x5f, 0xed, 0xad, 0xbe, 0xb8,
+  0x29, 0xdc, 0x86, 0x88, 0x32, 0x2c, 0x89, 0x5b,
+  0x9a, 0x4f, 0xed, 0x4c, 0xae, 0xa6, 0x0a, 0x9d,
+  0x0f, 0x4c, 0x3f, 0xd0, 0xb6, 0xb9, 0x1c, 0xff,
+  0xf2, 0x85, 0x1b, 0x9a, 0xf0, 0x66, 0xd8, 0x1a,
+  0xce, 0x9c, 0xa2, 0xd1, 0xd0, 0xab, 0xb2, 0x1b,
+  0x1d, 0xe4, 0x68, 0xc8, 0x61, 0xe8, 0xf7, 0x7a,
+  0x35, 0xed, 0x0d, 0xb5, 0x14, 0xe7, 0xf0, 0x02,
+  0xbd, 0x8b, 0xe3, 0xa7, 0xf5, 0xfc, 0xdb, 0xd7,
+  0x7a, 0x95, 0x26, 0x1d, 0x3f, 0x60, 0x6b, 0x15,
+  0x77, 0x8f, 0x17, 0x79, 0xac, 0x79, 0x17, 0x75,
+  0x75, 0x9e, 0x1d, 0x29, 0x79, 0xd3, 0xf8, 0x1e,
+  0x18, 0xc5, 0x43, 0xa7, 0x33, 0x6c, 0x3a, 0x14,
+  0xfb, 0xb0, 0x8f, 0x8b, 0xe7, 0x5f, 0xd4, 0x1d,
+  0x3f, 0xed, 0x2f, 0x5d, 0xe3, 0xf3, 0x3d, 0x53,
+  0xa7, 0xfe, 0x50, 0xeb, 0x2f, 0xce, 0x1a, 0xd4,
+  0xa8, 0xd9, 0x10, 0xac, 0x43, 0x9f, 0x5b, 0xde,
+  0xa6, 0xa7, 0x41, 0x53, 0xf5, 0x77, 0xa8, 0xab,
+  0x0a, 0x82, 0xa0, 0xa8, 0x2a, 0x0a, 0x87, 0x9e,
+  0xff, 0x82, 0xbe, 0x2d, 0xd0, 0x2b, 0x50, 0x29,
+  0xbc, 0x2a, 0x6b, 0x61, 0x53, 0xf7, 0x75, 0xda,
+  0x56, 0x15, 0xb8, 0xb5, 0x93, 0x76, 0x54, 0x15,
+  0x05, 0x43, 0xcb, 0x4f, 0x05, 0x41, 0x50, 0x54,
+  0x15, 0x05, 0x41, 0x50, 0x54, 0x50, 0x6f, 0x36,
+  0x0a, 0xf0, 0x57, 0xc1, 0x55, 0x0a, 0x6c, 0x15,
+  0x05, 0x41, 0x50, 0xf2, 0xd2, 0xa1, 0x50, 0x54,
+  0x15, 0x05, 0x41, 0x50, 0xf3, 0x51, 0xf0, 0x55,
+  0xc2, 0x9b, 0xc2, 0xa0, 0xa8, 0x2a, 0x0a, 0x82,
+  0xa2, 0x83, 0x51, 0xac, 0x28, 0x42, 0xac, 0x15,
+  0x2d, 0x65, 0x41, 0x50, 0x54, 0x15, 0x05, 0x46,
+  0xc6, 0xa2, 0x90, 0xaf, 0x82, 0xb4, 0x0a, 0x82,
+  0xa0, 0xa8, 0x2a, 0x7d, 0x65, 0xfa, 0xb8, 0x54,
+  0x15, 0x0f, 0x3c, 0xf4, 0x0a, 0xb0, 0x57, 0x05,
+  0x7c, 0x4f, 0x24, 0x2a, 0x0a, 0x82, 0xa0, 0xa8,
+  0x2a, 0x1e, 0x6a, 0x29, 0x0a, 0xf0, 0x53, 0x60,
+  0xa8, 0x2a, 0x0a, 0x82, 0xa0, 0xa8, 0x79, 0xa8,
+  0xd8, 0x2a, 0xc1, 0x40, 0x15, 0x2b, 0x15, 0x05,
+  0x41, 0x52, 0x79, 0x50, 0x55, 0x25, 0x84, 0x15,
+  0x05, 0x41, 0x50, 0x54, 0x50, 0x7c, 0xcf, 0x0a,
+  0xd6, 0x34, 0x83, 0x4d, 0x05, 0x7c, 0x15, 0x70,
+  0xa9, 0x61, 0x50, 0x54, 0x15, 0x27, 0x95, 0x05,
+  0x52, 0x58, 0x41, 0x50, 0x54, 0x29, 0xe9, 0x3c,
+  0x2b, 0xc3, 0x42, 0x34, 0xc0, 0xa8, 0x2a, 0x0a,
+  0x82, 0xa0, 0xa8, 0x2a, 0x14, 0xd9, 0x52, 0x14,
+  0x21, 0x4c, 0x0a, 0x00, 0xa8, 0x2a, 0x0a, 0x82,
+  0xa0, 0x4b, 0xea, 0x85, 0x5c, 0x2a, 0x0a, 0x82,
+  0xa0, 0xa8, 0x61, 0x7c, 0x01, 0x57, 0x0a, 0x93,
+  0x0a, 0x82, 0xa0, 0xa8, 0xf8, 0xb4, 0xd0, 0x2a,
+  0x0a, 0x82, 0xa0, 0xa8, 0x2a, 0x14, 0xd4, 0x34,
+  0x15, 0x60, 0xad, 0x02, 0xa1, 0x57, 0xec, 0xa8,
+  0x73, 0x79, 0xee, 0xc5, 0x38, 0xb8, 0x8d, 0xd4,
+  0xa4, 0x79, 0x9f, 0x56, 0x7a, 0xd1, 0xd0, 0xc2,
+  0x39, 0x89, 0x16, 0x37, 0xe6, 0x6f, 0x8e, 0xc1,
+  0xda, 0xac, 0xf7, 0x61, 0xd1, 0xe5, 0xb3, 0x27,
+  0xe9, 0x5a, 0x85, 0x9b, 0xc9, 0x1b, 0xd2, 0xa7,
+  0xcf, 0x05, 0xca, 0x94, 0xe4, 0xd6, 0x27, 0x79,
+  0x58, 0x54, 0xf7, 0x93, 0x84, 0xe9, 0xde, 0xdb,
+  0x0e, 0x9c, 0xbb, 0xdd, 0x4a, 0x23, 0x84, 0xe2,
+  0xc3, 0x77, 0x1f, 0x9f, 0xd6, 0xf7, 0xfb, 0x0a,
+  0xd0, 0x74, 0x52, 0x88, 0x56, 0x94, 0x26, 0xf9,
+  0x4e, 0x9f, 0x87, 0x83, 0x7a, 0xfc, 0x74, 0xdc,
+  0x27, 0x4b, 0xc7, 0x21, 0x69, 0x24, 0x3a, 0x4c,
+  0x3a, 0x76, 0x6a, 0x3b, 0xc8, 0x94, 0x11, 0x6b,
+  0x20, 0xf0, 0xf6, 0xf0, 0xf9, 0xff, 0xf6, 0x8b,
+  0xbb, 0x84, 0x7b, 0xe5, 0x77, 0xff, 0xfe, 0x74,
+  0x3d, 0x9b, 0x31, 0xb4, 0x24, 0x50, 0xb3, 0xd0,
+  0xa2, 0x68, 0x93, 0xa9, 0x54, 0xa1, 0x0b, 0x9b,
+  0xaf, 0x4f, 0xe5, 0x0b, 0xf0, 0x69, 0x87, 0x4f,
+  0xcf, 0x0f, 0x3e, 0xd8, 0x74, 0xfa, 0x8f, 0x0a,
+  0xbc, 0xe8, 0x13, 0xd3, 0x02, 0xc9, 0xff, 0x59,
+  0x47, 0xe0, 0xcf, 0xfb, 0xe3, 0xa7, 0x66, 0x34,
+  0x74, 0xb2, 0xc7, 0xb3, 0xf1, 0xf4, 0xfd, 0x5c,
+  0x6c, 0x0b, 0x49, 0xd3, 0xca, 0x17, 0x43, 0xa4,
+  0xb8, 0x8e, 0xe0, 0x79, 0xb9, 0x46, 0xa1, 0x74,
+  0xf6, 0x9c, 0x2f, 0x3a, 0x79, 0x74, 0x6e, 0xea,
+  0x54, 0xf9, 0xee, 0xff, 0xff, 0xce, 0x80, 0x3d,
+  0x2d, 0x09, 0xe3, 0x64, 0x4a, 0xe3, 0x9c, 0x31,
+  0x53, 0x67, 0xd1, 0xb8, 0xe9, 0x0d, 0x89, 0xf8,
+  0x74, 0xfb, 0x01, 0x0e, 0x9f, 0xea, 0x03, 0x1f,
+  0x6c, 0xfa, 0xa7, 0x4f, 0x6d, 0xb2, 0xb6, 0x3a,
+  0x7f, 0xfc, 0xb6, 0x56, 0x22, 0xdf, 0x05, 0x3b,
+  0x90, 0xd1, 0x7c, 0x4f, 0xef, 0xfa, 0xf5, 0x5c,
+  0xa0, 0xe9, 0xff, 0xfb, 0x2f, 0xbd, 0xea, 0xdb,
+  0xc1, 0xf0, 0xf9, 0x59, 0x85, 0x4d, 0x7c, 0x3a,
+  0x7c, 0x3e, 0xa3, 0x98, 0x69, 0x84, 0xe7, 0xaf,
+  0xa2, 0xf1, 0xa6, 0x13, 0x9b, 0xe5, 0x35, 0x02,
+  0x73, 0xf8, 0x3b, 0x5d, 0xd4, 0x7e, 0x35, 0x02,
+  0x73, 0xfa, 0xb9, 0x6f, 0x57, 0x4a, 0x0d, 0x30,
+  0x9c, 0xd9, 0xb1, 0xa6, 0x13, 0x9b, 0xff, 0xcf,
+  0x30, 0x9c, 0x62, 0x69, 0xf4, 0x9a, 0x78, 0xb9,
+  0x84, 0x75, 0x40, 0x6c, 0x85, 0xf9, 0x1c, 0xae,
+  0x59, 0x84, 0xdc, 0x7d, 0x12, 0xf5, 0x29, 0xfd,
+  0x7f, 0x1e, 0x64, 0x55, 0x54, 0x4d, 0xe5, 0x2b,
+  0xc2, 0xab, 0xa1, 0xd8, 0xe5, 0x09, 0x6c, 0xb7,
+  0x79, 0x57, 0x93, 0xed, 0xb0, 0x7d, 0xac, 0xe9,
+  0xf0, 0x66, 0xfc, 0x68, 0xe9, 0xfe, 0xb7, 0x32,
+  0xde, 0x5a, 0x5e, 0x74, 0xfd, 0xbc, 0x1f, 0xa9,
+  0xd4, 0x1d, 0x1e, 0x3e, 0xbf, 0x8e, 0x60, 0x11,
+  0x6d, 0x78, 0x49, 0xc2, 0xae, 0x92, 0xe4, 0xbc,
+  0xdf, 0x29, 0x74, 0x37, 0xe7, 0xff, 0x32, 0xf5,
+  0xf0, 0x52, 0xfb, 0xfa, 0xbe, 0x3a, 0x7f, 0xff,
+  0x06, 0x53, 0x95, 0xe0, 0xb7, 0x96, 0xf6, 0xd3,
+  0x98, 0x74, 0xfc, 0x1a, 0x33, 0xd6, 0x53, 0xa7,
+  0xff, 0xdc, 0x17, 0xee, 0xb0, 0x2d, 0xeb, 0xfe,
+  0x58, 0xe9, 0xc3, 0x5a, 0x9e, 0x20, 0x39, 0xff,
+  0xed, 0xe2, 0xb6, 0x5d, 0xd8, 0x29, 0xdc, 0x86,
+  0x88, 0x0d, 0xc6, 0xa2, 0x3e, 0x47, 0x25, 0xde,
+  0xa3, 0x13, 0x35, 0xf4, 0x62, 0x33, 0xff, 0xfb,
+  0x9f, 0x95, 0xf0, 0x8f, 0x99, 0xbe, 0xf6, 0xcf,
+  0xee, 0x74, 0xff, 0xff, 0x73, 0xf0, 0x1a, 0x7e,
+  0x52, 0xfd, 0xeb, 0xf3, 0xbf, 0xff, 0xf2, 0xa2,
+  0xc8, 0xcf, 0x06, 0x29, 0xfc, 0xb8, 0x29, 0xdc,
+  0x86, 0x88, 0x26, 0x7f, 0x96, 0xf8, 0x29, 0xdc,
+  0x86, 0x8b, 0xe6, 0x7d, 0xe6, 0xc1, 0x95, 0xd8,
+  0xfe, 0x90, 0xea, 0x7f, 0xd4, 0x75, 0x3a, 0x99,
+  0x70, 0xe6, 0xc7, 0x4e, 0xff, 0xff, 0xca, 0x9f,
+  0xaf, 0x6c, 0x4e, 0x12, 0x9c, 0x5f, 0xc5, 0x08,
+  0x9b, 0x06, 0x29, 0xff, 0xa8, 0x62, 0xd3, 0x50,
+  0xca, 0x37, 0xbc, 0xe9, 0xff, 0xed, 0xf4, 0x86,
+  0xe4, 0xb7, 0xbe, 0xf9, 0x45, 0xe7, 0x4e, 0xff,
+  0xff, 0xca, 0x9f, 0xdb, 0xfe, 0x50, 0xca, 0x6e,
+  0x53, 0x8b, 0xf9, 0xff, 0xf9, 0xbb, 0xdc, 0x96,
+  0xf6, 0xdb, 0x67, 0xfb, 0xaf, 0x5c, 0xa0, 0xe9,
+  0x75, 0x91, 0x59, 0xa2, 0x24, 0x3d, 0x54, 0x7f,
+  0xa1, 0xb6, 0x24, 0x6c, 0x48, 0xbc, 0x64, 0x13,
+  0xfe, 0xcb, 0xa8, 0xd6, 0xca, 0x17, 0x3c, 0x41,
+  0x13, 0xf9, 0x70, 0x53, 0xb9, 0x0d, 0x10, 0x43,
+  0x8f, 0x22, 0x7e, 0xeb, 0x08, 0xfb, 0xf3, 0xa7,
+  0xed, 0x5e, 0xdf, 0xf0, 0x3c, 0xe8, 0x03, 0xde,
+  0xd0, 0xb2, 0x3e, 0x46, 0x58, 0x42, 0xa6, 0x7f,
+  0x94, 0x2f, 0xbf, 0x2d, 0xd4, 0x9d, 0x3f, 0xfd,
+  0xdf, 0xdf, 0x2c, 0xbe, 0xb8, 0x65, 0xbc, 0x74,
+  0x3d, 0x10, 0xe0, 0x73, 0x3f, 0xaf, 0xbd, 0x95,
+  0xff, 0xa9, 0x3a, 0x7b, 0xcd, 0x7b, 0xf3, 0xa7,
+  0xff, 0xda, 0x50, 0x0b, 0x96, 0x72, 0xdf, 0x2d,
+  0xa0, 0x9d, 0x3e, 0xcb, 0xd7, 0x7d, 0x76, 0x3f,
+  0x9d, 0xe4, 0x93, 0xf2, 0x5b, 0xda, 0x9e, 0xd6,
+  0x74, 0xfc, 0xc5, 0xd5, 0xdb, 0x28, 0x3a, 0x7f,
+  0xff, 0xfb, 0xd7, 0xe6, 0x70, 0x7c, 0xff, 0x57,
+  0x46, 0x5b, 0xcb, 0x7b, 0x69, 0xcc, 0x3a, 0x36,
+  0x47, 0x1f, 0x8c, 0xb8, 0xc6, 0x70, 0xef, 0xa9,
+  0xd3, 0xfe, 0xe0, 0x4c, 0x14, 0xee, 0x43, 0x44,
+  0x23, 0x0a, 0x7c, 0x3a, 0x0e, 0xcf, 0xfe, 0x5c,
+  0xa7, 0x7d, 0xfc, 0x1a, 0x3f, 0x2a, 0x74, 0xff,
+  0xf7, 0x75, 0x1b, 0xf2, 0xdc, 0xc7, 0x7f, 0xff,
+  0xe7, 0x4b, 0x36, 0x45, 0x03, 0x49, 0x93, 0xbf,
+  0xff, 0xf2, 0xa7, 0xfb, 0x3e, 0xe1, 0xc6, 0xd9,
+  0xb1, 0x4e, 0x2f, 0xe6, 0xff, 0xf2, 0xa7, 0x7f,
+  0xff, 0xe5, 0x4f, 0xdd, 0x46, 0xd6, 0x5a, 0x94,
+  0xe2, 0xfe, 0x01, 0x17, 0x9f, 0xa4, 0x6a, 0x1b,
+  0xcf, 0x93, 0xdb, 0x6f, 0x61, 0x4e, 0x36, 0x73,
+  0xbf, 0xff, 0xf2, 0xa7, 0x55, 0x44, 0xa7, 0x17,
+  0xf2, 0xfb, 0xc8, 0x82, 0xba, 0xcc, 0xfd, 0xb0,
+  0x2b, 0xf9, 0x0e, 0x9f, 0xdb, 0xc7, 0x6f, 0x36,
+  0x5d, 0x8e, 0x9f, 0xd7, 0xb6, 0x36, 0xcb, 0xd4,
+  0xe8, 0x14, 0x4b, 0xd8, 0xac, 0x0e, 0x21, 0x51,
+  0xdf, 0x90, 0xc1, 0x9d, 0x4e, 0xaa, 0x5b, 0xa9,
+  0xd3, 0xff, 0xb3, 0x57, 0xc1, 0xf6, 0x22, 0xd9,
+  0x58, 0x74, 0xfc, 0x9e, 0xad, 0xbc, 0xd1, 0x53,
+  0xf8, 0x32, 0x97, 0xd7, 0xda, 0xce, 0x9e, 0xee,
+  0x1d, 0x67, 0x46, 0xe3, 0xd6, 0xa0, 0xd6, 0x79,
+  0x79, 0x8d, 0x8a, 0x9d, 0xff, 0xff, 0x95, 0x3f,
+  0xfd, 0xbd, 0x7e, 0xcc, 0x0b, 0xdb, 0xca, 0x14,
+  0x14, 0xe2, 0xfe, 0x58, 0x88, 0xa0, 0x62, 0x0c,
+  0x2a, 0x7c, 0xaf, 0x2b, 0xa5, 0x2b, 0xd0, 0x84,
+  0xb4, 0x31, 0x67, 0xff, 0xcc, 0xc4, 0x50, 0xeb,
+  0xd7, 0x6d, 0x38, 0x5e, 0x74, 0xf9, 0x6f, 0x56,
+  0xd8, 0x74, 0x29, 0xfd, 0xdd, 0x4e, 0x7f, 0xfb,
+  0xcd, 0xb0, 0x36, 0x0e, 0xff, 0x03, 0xb5, 0x9d,
+  0x3f, 0xff, 0xdb, 0x5b, 0xdf, 0xe3, 0x7f, 0x99,
+  0xd7, 0xae, 0x8f, 0xca, 0x6e, 0x74, 0x62, 0x2f,
+  0xf9, 0x46, 0x15, 0xb1, 0xec, 0xa1, 0x31, 0xf1,
+  0xca, 0x6d, 0x0f, 0x8c, 0x96, 0x57, 0xe8, 0xda,
+  0x5a, 0x85, 0x78, 0x91, 0x32, 0x16, 0x16, 0x8c,
+  0x9f, 0xe8, 0x48, 0x84, 0x30, 0xab, 0x2a, 0xa6,
+  0xf2, 0x82, 0xf4, 0x86, 0x87, 0xf0, 0xe0, 0x9c,
+  0xd9, 0x40, 0xe9, 0xff, 0xec, 0x07, 0x5f, 0x5f,
+  0xa9, 0xad, 0xb3, 0xee, 0x3a, 0x54, 0xbc, 0xfb,
+  0xb6, 0x1c, 0x9f, 0xac, 0xd7, 0xad, 0xe6, 0x1d,
+  0x3f, 0xe0, 0x5b, 0xdb, 0xbe, 0xea, 0x6a, 0x74,
+  0xe6, 0xb4, 0x13, 0xa7, 0xfd, 0xde, 0x1c, 0xa5,
+  0xdf, 0xff, 0xf9, 0xd1, 0xc7, 0xbd, 0x51, 0xd9,
+  0xff, 0xe0, 0x57, 0xee, 0xdf, 0x7f, 0x06, 0x8f,
+  0xca, 0x9d, 0x18, 0x99, 0xfa, 0x17, 0xda, 0x13,
+  0x9f, 0x10, 0xcf, 0xe5, 0x07, 0x86, 0x67, 0xc7,
+  0x4f, 0xe7, 0xe0, 0xd4, 0x16, 0x83, 0xa7, 0xff,
+  0x95, 0xb2, 0x8b, 0xb7, 0xdc, 0x32, 0x8f, 0x09,
+  0xee, 0xf7, 0x9f, 0xfe, 0xcb, 0xa8, 0x26, 0x5e,
+  0xde, 0x1f, 0x90, 0xe9, 0xf7, 0x57, 0x02, 0xe7,
+  0x4e, 0xbf, 0x6a, 0xce, 0x9f, 0xd7, 0xb7, 0x9d,
+  0xf7, 0x78, 0xe8, 0xa1, 0x32, 0x2d, 0x97, 0x81,
+  0x32, 0xe4, 0xba, 0x0f, 0xcf, 0xed, 0x3e, 0x5b,
+  0x7b, 0x9e, 0x74, 0xff, 0xfc, 0x19, 0x5d, 0x37,
+  0x65, 0xb8, 0x31, 0xa7, 0xad, 0x27, 0x4f, 0xfb,
+  0x2b, 0xa6, 0x0a, 0x77, 0x21, 0xa2, 0x06, 0x9f,
+  0x65, 0xed, 0xcf, 0xdc, 0x8a, 0x30, 0x5c, 0x9f,
+  0xff, 0xff, 0xb2, 0xf6, 0xe0, 0xd7, 0xba, 0xa3,
+  0xdd, 0x76, 0xd9, 0xb6, 0xec, 0x67, 0x05, 0x2f,
+  0x3c, 0x41, 0x73, 0xfe, 0xee, 0xd6, 0x9d, 0xb6,
+  0xed, 0x7f, 0x9e, 0x20, 0xb9, 0xff, 0xad, 0xeb,
+  0x79, 0x42, 0xfb, 0xb5, 0xfe, 0x78, 0x82, 0xe7,
+  0xf2, 0xf8, 0x2f, 0xbb, 0x5f, 0xe7, 0x88, 0x2e,
+  0x7e, 0x66, 0x6d, 0xbb, 0x5f, 0xe7, 0x88, 0x2e,
+  0x7f, 0xff, 0xb8, 0x03, 0xcc, 0xdd, 0x54, 0xb7,
+  0x87, 0xda, 0xe8, 0xcf, 0xcf, 0x10, 0x5c, 0xd4,
+  0xee, 0xd9, 0x3a, 0x24, 0x51, 0x15, 0x6e, 0x44,
+  0x04, 0x08, 0xb2, 0xa9, 0x40, 0x94, 0x7b, 0x3d,
+  0xc3, 0xf7, 0x1d, 0x3f, 0xf5, 0xbd, 0x6f, 0x28,
+  0x5f, 0x76, 0xbf, 0xcf, 0x10, 0x5c, 0xff, 0x35,
+  0x54, 0xf5, 0x1b, 0xb5, 0xfe, 0x78, 0x82, 0xe7,
+  0xd7, 0xaa, 0xb3, 0x72, 0x22, 0x8f, 0x7a, 0xb4,
+  0xff, 0xed, 0xc9, 0x6f, 0x22, 0xde, 0xbb, 0xb5,
+  0xfe, 0x78, 0x82, 0xe7, 0xff, 0xfe, 0x00, 0xf3,
+  0x37, 0x69, 0x9b, 0xaa, 0x96, 0xf0, 0xfb, 0x5d,
+  0x19, 0xf9, 0xe2, 0x0b, 0x8c, 0x4c, 0x9a, 0x94,
+  0x3e, 0x5d, 0x9f, 0xeb, 0x78, 0x7d, 0xae, 0x8c,
+  0xfc, 0xf1, 0x05, 0xcf, 0xff, 0x77, 0x52, 0xfa,
+  0xdb, 0xdb, 0x6c, 0xa2, 0xa5, 0x4f, 0xfb, 0x1e,
+  0xfd, 0x2a, 0x21, 0x46, 0xa1, 0xe2, 0x0b, 0x84,
+  0x47, 0x40, 0xa4, 0xd5, 0x42, 0x7f, 0xc9, 0xe1,
+  0xbf, 0x7d, 0x5d, 0xdf, 0x9e, 0x20, 0xb9, 0xfa,
+  0xde, 0xb5, 0xbd, 0xf1, 0xa0, 0x0b, 0x9f, 0x67,
+  0xdb, 0xb5, 0xfe, 0x78, 0x82, 0xe6, 0xcb, 0xa1,
+  0xfb, 0x58, 0xf2, 0x29, 0x47, 0x85, 0x61, 0x89,
+  0x3f, 0x33, 0x36, 0xdd, 0xaf, 0xf3, 0xc4, 0x17,
+  0x3f, 0xe4, 0xb7, 0x87, 0xda, 0xe8, 0xcf, 0xcf,
+  0x10, 0x5c, 0xd9, 0xbb, 0x91, 0x1d, 0x54, 0x09,
+  0xfd, 0xa7, 0x99, 0xc1, 0x4b, 0xcf, 0x10, 0x5c,
+  0xff, 0xb3, 0xcd, 0xb0, 0x33, 0x6e, 0x79, 0xe2,
+  0x0b, 0x61, 0xe0, 0xc6, 0xcb, 0xb9, 0xbf, 0x15,
+  0x84, 0x7d, 0x35, 0x8c, 0x62, 0xf1, 0x8f, 0x69,
+  0x0b, 0x7f, 0xdc, 0x27, 0xdf, 0x57, 0xef, 0x94,
+  0xd1, 0x05, 0xb9, 0x10, 0x33, 0xfe, 0xc7, 0xdb,
+  0x9e, 0xde, 0xdf, 0xa5, 0x07, 0x4f, 0xe1, 0x0c,
+  0xda, 0xda, 0x7e, 0x74, 0xfa, 0x9b, 0xf0, 0xfc,
+  0x74, 0xfd, 0x94, 0x75, 0x97, 0x56, 0x74, 0x79,
+  0x11, 0x9c, 0x68, 0x05, 0x13, 0xb8, 0x68, 0x3a,
+  0x6f, 0x94, 0xe9, 0xef, 0x2b, 0x30, 0xe8, 0x3a,
+  0x7e, 0xed, 0x77, 0x51, 0xf8, 0xe8, 0xd8, 0xdc,
+  0x00, 0x54, 0xff, 0xfe, 0x5f, 0x6c, 0x0b, 0xa2,
+  0x5f, 0x13, 0x65, 0x4d, 0xec, 0x3a, 0x6f, 0x94,
+  0xe9, 0x97, 0x59, 0xd3, 0xfd, 0x97, 0xaa, 0xb3,
+  0x7e, 0x34, 0x74, 0xfe, 0xae, 0x5b, 0xd5, 0xd2,
+  0x83, 0xa6, 0xff, 0xf2, 0xa7, 0xf8, 0x31, 0xb7,
+  0x3e, 0xbe, 0xd8, 0xe8, 0x44, 0xfe, 0x7c, 0x36,
+  0x22, 0xcc, 0x58, 0xb1, 0x0f, 0xcc, 0x2d, 0xd8,
+  0xb0, 0x0b, 0xd4, 0xeb, 0xf3, 0x5d, 0xe3, 0x13,
+  0xbf, 0xff, 0xf2, 0xa4, 0xc2, 0x9c, 0x5f, 0xcf,
+  0xb9, 0xae, 0xe1, 0x29, 0xc8, 0xdd, 0xdf, 0x0b,
+  0xe9, 0xfd, 0x4d, 0xd7, 0x2d, 0x94, 0x1d, 0x0a,
+  0xd9, 0x08, 0xe4, 0x6d, 0x3a, 0xd0, 0xa9, 0x30,
+  0xf4, 0x6a, 0x62, 0x9b, 0x68, 0x6b, 0xf5, 0x24,
+  0x88, 0x12, 0x6b, 0x0d, 0x2d, 0x25, 0x82, 0x36,
+  0x4b, 0x9e, 0xc4, 0x5b, 0x9d, 0x3d, 0x8c, 0xcb,
+  0x9d, 0x3d, 0xd4, 0x6f, 0x79, 0xd0, 0xa7, 0xc7,
+  0x48, 0xfb, 0x79, 0x04, 0xfc, 0x1a, 0x6c, 0xce,
+  0x79, 0xd3, 0xff, 0xd4, 0xbc, 0x17, 0x73, 0x01,
+  0x75, 0xdf, 0xd4, 0x1d, 0x3f, 0xab, 0x76, 0xd8,
+  0x19, 0xb1, 0xd0, 0xa8, 0xb6, 0xf1, 0x77, 0x2a,
+  0x4e, 0xed, 0xdb, 0xce, 0x9f, 0xfe, 0x07, 0xee,
+  0xcd, 0xbd, 0x5a, 0x6f, 0xa7, 0x54, 0xe8, 0xdc,
+  0x7e, 0x78, 0x3f, 0x3f, 0x50, 0xd3, 0xdb, 0x83,
+  0x41, 0xd3, 0x3e, 0x83, 0xa7, 0xd6, 0xcf, 0x3e,
+  0xa7, 0x4f, 0xff, 0x59, 0x77, 0xba, 0xe1, 0xdf,
+  0x56, 0xab, 0xf1, 0x53, 0xfb, 0xec, 0x14, 0xee,
+  0x43, 0xc4, 0x09, 0x0f, 0x45, 0xae, 0xc4, 0xe2,
+  0xa5, 0x33, 0x7b, 0xce, 0x9e, 0xbd, 0x1c, 0x07,
+  0x4f, 0x53, 0x5e, 0xb9, 0xd1, 0x41, 0xee, 0x60,
+  0xcd, 0x88, 0x67, 0xf0, 0x77, 0xf5, 0xaa, 0xfc,
+  0x74, 0xef, 0xff, 0xfc, 0xf8, 0x7d, 0x4e, 0xe0,
+  0xd8, 0xb8, 0x7d, 0x38, 0xd6, 0x46, 0xc8, 0x97,
+  0xf9, 0x7e, 0x7f, 0xfd, 0x81, 0xed, 0x6e, 0xad,
+  0xed, 0xa7, 0x3d, 0xea, 0x74, 0x50, 0x7f, 0x9a,
+  0xc9, 0x63, 0x55, 0xaa, 0xf3, 0x79, 0xa6, 0x43,
+  0x33, 0xd0, 0x8c, 0xe8, 0xd0, 0xa7, 0xde, 0xba,
+  0xde, 0xa5, 0x4f, 0x22, 0xde, 0xa5, 0x4d, 0xff,
+  0xe5, 0x43, 0xcf, 0x7f, 0x09, 0xff, 0x20, 0x9b,
+  0x3f, 0x29, 0xc6, 0xbe, 0x7f, 0xfd, 0x97, 0x54,
+  0xcc, 0x0b, 0xdb, 0xca, 0x14, 0x1d, 0x1f, 0x1f,
+  0xbf, 0xe4, 0xd3, 0xff, 0xf9, 0x5b, 0x78, 0x3e,
+  0xdd, 0x7a, 0xe2, 0x5b, 0x82, 0xf5, 0x3a, 0x7f,
+  0x35, 0x4b, 0xed, 0xa2, 0x89, 0xd3, 0x9f, 0xc2,
+  0x74, 0xf9, 0xf9, 0x7c, 0xd8, 0xa9, 0x79, 0xa3,
+  0xc1, 0xb8, 0xd4, 0xdf, 0x29, 0xd3, 0x7c, 0xa7,
+  0x4f, 0xc1, 0xa3, 0xf0, 0x1d, 0xe3, 0x59, 0xf0,
+  0xb4, 0xff, 0xd7, 0xb6, 0x33, 0x7a, 0xfd, 0x94,
+  0xdc, 0xe9, 0xfd, 0x4a, 0x78, 0x77, 0xae, 0xc7,
+  0x4f, 0x7c, 0xce, 0x7d, 0x4f, 0xf2, 0xe8, 0xf3,
+  0xb5, 0x32, 0x93, 0xa1, 0x4f, 0x67, 0x8e, 0xa7,
+  0x7f, 0xff, 0xe5, 0x4f, 0xcb, 0x9a, 0xc3, 0x4a,
+  0x94, 0xe2, 0xfe, 0x7b, 0xfe, 0x07, 0x9d, 0x32,
+  0x58, 0xe9, 0xdf, 0xff, 0xf9, 0x53, 0xf7, 0xbb,
+  0x5d, 0xbd, 0x72, 0x9c, 0x5f, 0xcf, 0xb3, 0xec,
+  0xc6, 0x8e, 0x95, 0x77, 0x22, 0x64, 0x4d, 0x00,
+  0xfa, 0x7b, 0xc1, 0xa3, 0xf6, 0x47, 0x86, 0x42,
+  0xea, 0x15, 0x70, 0x5d, 0xe4, 0x98, 0xc7, 0xad,
+  0xd8, 0x55, 0x6d, 0x18, 0xcd, 0x4f, 0xef, 0x19,
+  0x6c, 0xfc, 0xac, 0x11, 0xeb, 0x9d, 0x3f, 0xfd,
+  0xe6, 0x52, 0xfa, 0xee, 0xc0, 0x0c, 0xf7, 0xc7,
+  0x45, 0x8f, 0xf2, 0xe5, 0x52, 0x73, 0x74, 0x84,
+  0x1a, 0x4a, 0xca, 0xab, 0xa2, 0x31, 0x67, 0xca,
+  0x55, 0xda, 0x54, 0x36, 0x56, 0xd3, 0x7a, 0xe3,
+  0x6f, 0x48, 0xec, 0x69, 0x95, 0x4b, 0xe8, 0x50,
+  0xb5, 0x3c, 0x50, 0x33, 0xa5, 0x6c, 0x94, 0x1b,
+  0x69, 0xec, 0xce, 0xa7, 0x6d, 0x7d, 0x2b, 0xe0,
+  0x27, 0x59, 0x2b, 0x59, 0x1a, 0xde, 0xb3, 0xa9,
+  0xd2, 0x33, 0x46, 0xd0, 0xe8, 0xfe, 0x14, 0x3a,
+  0x92, 0xc5, 0xb7, 0xce, 0xbe, 0x37, 0xc3, 0xee,
+  0x1d, 0x08, 0x5b, 0x07, 0xe2, 0x0e, 0x56, 0x7f,
+  0x3b, 0x05, 0x3b, 0x90, 0xd1, 0x71, 0xcf, 0xe7,
+  0x60, 0xa7, 0x72, 0x1a, 0x2e, 0xb9, 0xff, 0x9d,
+  0xcf, 0x76, 0x0a, 0x77, 0x21, 0xa2, 0x51, 0x85,
+  0x84, 0x48, 0x2b, 0xca, 0x36, 0x3b, 0xd6, 0x76,
+  0x87, 0x7e, 0x87, 0x8e, 0xac, 0xff, 0xb1, 0x0c,
+  0x05, 0x53, 0x8b, 0x9d, 0xb7, 0x9d, 0xcf, 0xfe,
+  0x73, 0x39, 0xee, 0xc1, 0x4e, 0xe4, 0x34, 0x4b,
+  0x53, 0xe1, 0x4e, 0xe4, 0x34, 0x46, 0xf3, 0xfe,
+  0xe7, 0xbb, 0x05, 0x3b, 0x90, 0xd1, 0x2f, 0xc9,
+  0xd8, 0x7e, 0xcc, 0x30, 0x9f, 0xce, 0xc1, 0x4e,
+  0xe4, 0x34, 0x55, 0x73, 0xfd, 0xaf, 0x03, 0x29,
+  0xbf, 0x30, 0xe9, 0xb6, 0xf1, 0xd3, 0xf6, 0x0a,
+  0x77, 0x21, 0xa2, 0x40, 0x8d, 0xc7, 0x98, 0xe1,
+  0x79, 0xf5, 0x78, 0x3a, 0x93, 0xa1, 0xe7, 0x95,
+  0x49, 0x24, 0x6b, 0x47, 0x97, 0x43, 0x3e, 0x7f,
+  0xe0, 0xca, 0x1d, 0xa8, 0xa0, 0x19, 0x73, 0xa1,
+  0xc7, 0xda, 0x25, 0x33, 0xf9, 0xd8, 0x29, 0xdc,
+  0x86, 0x8b, 0x22, 0x7f, 0x3b, 0x05, 0x3b, 0x90,
+  0xd1, 0x6b, 0xcf, 0xe7, 0x60, 0xa7, 0x72, 0x1a,
+  0x2e, 0x49, 0xf0, 0xa7, 0x72, 0x1a, 0x2e, 0xc9,
+  0xff, 0x73, 0xdd, 0x82, 0x9d, 0xc8, 0x68, 0xa3,
+  0xa4, 0xec, 0x3f, 0x66, 0x18, 0x4f, 0x85, 0x3b,
+  0x90, 0xd1, 0x4a, 0xcf, 0xff, 0xff, 0x59, 0x68,
+  0x5b, 0x79, 0xb7, 0x6d, 0x6f, 0x39, 0x2d, 0xe6,
+  0xac, 0xb4, 0x61, 0xd3, 0xe7, 0x33, 0x9e, 0xec,
+  0x45, 0x93, 0x46, 0x11, 0x42, 0xe7, 0x53, 0xe1,
+  0x91, 0x49, 0x3f, 0xa3, 0x9a, 0x61, 0x0f, 0xc7,
+  0x75, 0x3b, 0xbc, 0x2c, 0x5b, 0x43, 0x66, 0x7f,
+  0x9e, 0xec, 0x14, 0xee, 0x43, 0x44, 0x71, 0x3f,
+  0xde, 0x76, 0x0a, 0x77, 0x21, 0xa2, 0xb5, 0x93,
+  0xb9, 0x10, 0x57, 0x41, 0x9f, 0xfc, 0xe6, 0x73,
+  0xdd, 0x82, 0x9d, 0xc8, 0x68, 0x96, 0xe6, 0xca,
+  0x4e, 0x9f, 0xdb, 0x63, 0x18, 0xbe, 0xa9, 0xd1,
+  0x49, 0xe4, 0xf8, 0x5a, 0x75, 0xb6, 0x79, 0xd3,
+  0x9e, 0xc4, 0x3a, 0x0d, 0x10, 0xdc, 0xff, 0xb9,
+  0xee, 0xc1, 0x4e, 0xe4, 0x34, 0x4c, 0x13, 0x87,
+  0x4f, 0x8a, 0x9f, 0xc1, 0x97, 0xba, 0x8d, 0x4e,
+  0x93, 0x95, 0x30, 0x5a, 0x08, 0xf6, 0x1d, 0x41,
+  0xb6, 0x0b, 0xdd, 0x1b, 0x78, 0xec, 0xe6, 0x68,
+  0x25, 0x4f, 0xfb, 0x9e, 0xec, 0x14, 0xee, 0x43,
+  0x44, 0xc7, 0x27, 0x78, 0xf8, 0x98, 0x39, 0x3f,
+  0x2d, 0x77, 0x5f, 0x2c, 0x74, 0xff, 0xff, 0xf3,
+  0xeb, 0x6c, 0xd3, 0xfa, 0xdb, 0x13, 0x2b, 0xbb,
+  0x29, 0x7d, 0x7c, 0x1e, 0x3a, 0x79, 0x3b, 0x90,
+  0xd1, 0x58, 0xcf, 0xfb, 0x53, 0x2e, 0x19, 0xa2,
+  0x85, 0xce, 0x8d, 0x69, 0x8c, 0xd2, 0x5c, 0x30,
+  0x81, 0xb9, 0x5c, 0xff, 0xe5, 0x0b, 0xeb, 0xd1,
+  0x43, 0x11, 0x44, 0xe9, 0xff, 0x66, 0xd6, 0xca,
+  0xd2, 0xf5, 0xb1, 0xd3, 0xff, 0xff, 0x06, 0x94,
+  0x62, 0x6e, 0x0d, 0x1b, 0xf7, 0x65, 0x2f, 0xcd,
+  0x03, 0xea, 0x9d, 0x3f, 0xb5, 0x5d, 0x0d, 0x3d,
+  0xb8, 0x34, 0x1d, 0x3a, 0xde, 0x76, 0x27, 0x0e,
+  0x88, 0xb6, 0x47, 0xb9, 0xfe, 0xa3, 0xe4, 0xda,
+  0x34, 0x74, 0xfb, 0x82, 0x8d, 0x2a, 0x74, 0x01,
+  0xe0, 0x54, 0x62, 0x79, 0x47, 0x80, 0xe9, 0xea,
+  0xd5, 0x7e, 0x3a, 0x2c, 0x78, 0x1f, 0x8f, 0x4f,
+  0x95, 0xff, 0x68, 0xf3, 0xa7, 0x28, 0x3c, 0xe8,
+  0x68, 0xf0, 0xee, 0x53, 0x3f, 0x2b, 0x30, 0x3d,
+  0xac, 0xe9, 0x54, 0xe8, 0xf1, 0xbd, 0xe2, 0xd9,
+  0xbe, 0x52, 0xa6, 0xff, 0xf2, 0xa3, 0xc6, 0xbb,
+  0xf1, 0x69, 0xfd, 0xcf, 0x0c, 0xbd, 0xbc, 0x53,
+  0x8d, 0x14, 0xf6, 0xdd, 0x4d, 0x4e, 0x9c, 0xa0,
+  0xd1, 0xd3, 0x02, 0x9d, 0x0d, 0x1a, 0xf1, 0x1b,
+  0x9e, 0x1f, 0xb1, 0xbc, 0xe9, 0xdb, 0xc7, 0x59,
+  0xd0, 0xa8, 0xb6, 0xc5, 0x2f, 0x10, 0xd8, 0x92,
+  0x6b, 0x5c, 0xe9, 0xdf, 0xff, 0xf9, 0x53, 0xff,
+  0x62, 0x6c, 0xb4, 0x6f, 0xcb, 0x75, 0x25, 0x38,
+  0xbf, 0x9e, 0xf0, 0xb7, 0xec, 0x74, 0x84, 0xe9,
+  0xf3, 0x3d, 0x7f, 0xb8, 0xe8, 0xa0, 0xf7, 0x35,
+  0x64, 0xba, 0x07, 0xcf, 0xe4, 0xf5, 0x43, 0x1b,
+  0x71, 0xd3, 0x65, 0xce, 0x8a, 0x4f, 0x1e, 0xc6,
+  0x53, 0xff, 0xd7, 0xf5, 0x6d, 0x9b, 0x06, 0x36,
+  0x0c, 0xa9, 0xd2, 0x72, 0xae, 0x4f, 0x6c, 0xc3,
+  0x8c, 0xc2, 0xc0, 0xc7, 0x0b, 0x43, 0xdf, 0x8e,
+  0xc0, 0xd6, 0xb0, 0xb1, 0xbb, 0xe6, 0xf2, 0x39,
+  0xf0, 0xa7, 0x72, 0x1a, 0x2b, 0x79, 0xff, 0x73,
+  0xdd, 0x82, 0x9d, 0xc8, 0x68, 0x9c, 0x24, 0xec,
+  0x3f, 0x66, 0x18, 0x4f, 0x85, 0x3b, 0x90, 0xd1,
+  0x68, 0xcf, 0x63, 0x5e, 0xd6, 0x74, 0x9d, 0x87,
+  0xa9, 0x63, 0x09, 0xe4, 0xee, 0x43, 0x45, 0xb5,
+  0x3f, 0x59, 0x58, 0xbe, 0xd8, 0xe9, 0x9d, 0x82,
+  0x7b, 0x17, 0x2b, 0x9f, 0xce, 0xc1, 0x4e, 0xe4,
+  0x34, 0x5c, 0xb3, 0xf9, 0xd8, 0x29, 0xdc, 0x86,
+  0x8b, 0xb6, 0x15, 0x9a, 0xad, 0x41, 0x43, 0xe3,
+  0xa0, 0xda, 0x19, 0xfa, 0xe5, 0x64, 0x7a, 0x74,
+  0xf3, 0x57, 0x18, 0xfd, 0x9e, 0xc1, 0xfe, 0xa5,
+  0x97, 0x3b, 0x9f, 0xce, 0xc1, 0x4e, 0xe4, 0x34,
+  0x54, 0xf3, 0xc9, 0xdc, 0x86, 0x8a, 0xe6, 0x7f,
+  0x3b, 0x05, 0x3b, 0x90, 0xd1, 0x67, 0x40, 0x9f,
+  0x35, 0x8a, 0xe7, 0xc2, 0x9d, 0xc8, 0x68, 0x90,
+  0xa7, 0xfb, 0xd4, 0xd6, 0xe0, 0xac, 0xa9, 0xd3,
+  0x3d, 0xd8, 0x7d, 0x3f, 0x18, 0x4f, 0x37, 0x4b,
+  0x2b, 0x0e, 0x9f, 0xd9, 0x6a, 0xd7, 0x06, 0x83,
+  0xa4, 0xec, 0x4c, 0x47, 0xa1, 0x15, 0x52, 0xeb,
+  0x93, 0xcf, 0xfe, 0x73, 0x39, 0xee, 0xc1, 0x4e,
+  0xe4, 0x34, 0x4f, 0x90, 0x8a, 0x92, 0xf5, 0x71,
+  0xd9, 0x59, 0x1e, 0x7c, 0x29, 0xdc, 0x86, 0x8a,
+  0xca, 0x7f, 0xdc, 0xf7, 0x60, 0xa7, 0x72, 0x1a,
+  0x26, 0xe9, 0xbc, 0xec, 0x3f, 0x66, 0x18, 0x4f,
+  0x85, 0x3b, 0x90, 0xd1, 0x2b, 0x4f, 0xf6, 0xbb,
+  0x7b, 0x76, 0x89, 0x95, 0x3a, 0x7c, 0xe6, 0x73,
+  0xdd, 0x87, 0xdb, 0xc6, 0x13, 0xe1, 0x4e, 0xe4,
+  0x34, 0x4b, 0x93, 0xfd, 0xee, 0x7d, 0xc1, 0x59,
+  0x53, 0xa7, 0x9b, 0x78, 0x14, 0xe9, 0xf3, 0x99,
+  0xcf, 0x76, 0x22, 0x26, 0xc6, 0x1c, 0x6f, 0x3f,
+  0xf3, 0xb9, 0xee, 0xc1, 0x4e, 0xe4, 0x34, 0x47,
+  0x73, 0xfd, 0x7b, 0x63, 0xdd, 0xc1, 0x53, 0xa7,
+  0xe6, 0xe0, 0x2a, 0x60, 0x1d, 0x3f, 0x6a, 0x81,
+  0x96, 0xeb, 0x9d, 0x3e, 0x14, 0xee, 0x43, 0x45,
+  0x43, 0x3e, 0xcb, 0x5f, 0x28, 0x3a, 0x4e, 0xd5,
+  0x11, 0x68, 0xdc, 0x2d, 0xc3, 0x0b, 0x98, 0x4f,
+  0x85, 0x3b, 0x90, 0xd1, 0x54, 0x4f, 0xfb, 0x9e,
+  0xec, 0x14, 0xee, 0x43, 0x44, 0xd7, 0x27, 0x61,
+  0xfb, 0x30, 0xc2, 0x7f, 0x3b, 0x05, 0x3b, 0x90,
+  0xd1, 0x56, 0x4f, 0xfc, 0xee, 0x7b, 0xb0, 0x53,
+  0xb9, 0x0d, 0x12, 0x24, 0xf8, 0x53, 0xb9, 0x0d,
+  0x16, 0x94, 0xff, 0xb9, 0xee, 0xc1, 0x4e, 0xe4,
+  0x34, 0x4f, 0xb2, 0x76, 0x1f, 0xb3, 0x0c, 0x27,
+  0xff, 0x39, 0x9c, 0xf7, 0x60, 0xa7, 0x72, 0x1a,
+  0x28, 0x49, 0xf5, 0xbd, 0x42, 0x89, 0xd3, 0xe1,
+  0x4e, 0xe4, 0x34, 0x51, 0xf3, 0xff, 0xf6, 0x6d,
+  0x65, 0xde, 0xeb, 0x87, 0x7d, 0x5a, 0xaf, 0xc5,
+  0x4f, 0x9c, 0xce, 0x7b, 0x95, 0x16, 0xb8, 0x4f,
+  0xa8, 0x61, 0x0a, 0xbb, 0x53, 0x44, 0x31, 0x9e,
+  0x97, 0x89, 0x9a, 0xe1, 0xd6, 0x90, 0xc1, 0xa4,
+  0x9d, 0xa3, 0xbb, 0x43, 0x0b, 0xe2, 0x7b, 0xc6,
+  0x0f, 0x3f, 0x9d, 0x82, 0x9d, 0xc8, 0x68, 0x88,
+  0xa7, 0xec, 0x14, 0xee, 0x43, 0x44, 0x57, 0x3f,
+  0xda, 0xb7, 0x60, 0xa7, 0x72, 0x1a, 0x2b, 0x88,
+  0x71, 0xfd, 0x71, 0xac, 0xf6, 0x5b, 0xae, 0x74,
+  0xfe, 0xcf, 0x0f, 0xdf, 0x69, 0x53, 0xa5, 0xaa,
+  0x01, 0xea, 0xd4, 0x82, 0x7f, 0xee, 0xf3, 0xfc,
+  0x17, 0xd2, 0xc3, 0x87, 0x4f, 0xb3, 0xdb, 0x0e,
+  0x1d, 0x3a, 0xf5, 0xf5, 0x8f, 0xa6, 0xe8, 0x73,
+  0xe1, 0x4e, 0xe4, 0x34, 0x53, 0xd0, 0xdc, 0x47,
+  0xca, 0xc2, 0x57, 0x0d, 0x27, 0xff, 0x73, 0xdd,
+  0xb0, 0x77, 0xf5, 0xaa, 0xfc, 0x74, 0x39, 0x10,
+  0x5b, 0x1b, 0xce, 0x76, 0xd8, 0x74, 0xf9, 0x5f,
+  0xf6, 0x8f, 0x3a, 0x79, 0x3b, 0x90, 0xd1, 0x59,
+  0xc3, 0x47, 0xa8, 0x25, 0x33, 0xf5, 0x0c, 0x50,
+  0x7d, 0x4e, 0x9c, 0xb4, 0x78, 0xe9, 0xf5, 0xfe,
+  0xde, 0x0f, 0x3a, 0x7d, 0x8d, 0x51, 0xa7, 0xc7,
+  0x49, 0xd8, 0x8c, 0x01, 0x22, 0xb1, 0x6f, 0x0e,
+  0x6f, 0x2a, 0x9f, 0xf9, 0xdc, 0xf7, 0x60, 0xa7,
+  0x72, 0x1a, 0x24, 0x59, 0xfc, 0xec, 0x14, 0xee,
+  0x43, 0x45, 0x93, 0x3f, 0x9d, 0x82, 0x9d, 0xc8,
+  0x68, 0xb6, 0x27, 0x65, 0x70, 0xe9, 0xf0, 0xa7,
+  0x72, 0x1a, 0x2d, 0xb9, 0x39, 0xe7, 0x95, 0x83,
+  0x53, 0xfe, 0x6e, 0x37, 0x35, 0x56, 0xf6, 0xc0,
+  0x5f, 0x8e, 0x9f, 0x94, 0x1f, 0xb6, 0x8c, 0x3a,
+  0x7c, 0x29, 0xdc, 0x86, 0x8b, 0xc2, 0x7a, 0xfa,
+  0x99, 0x63, 0xa7, 0xfe, 0x5d, 0xec, 0xa5, 0xf7,
+  0xc0, 0xbd, 0x4e, 0x9f, 0x60, 0x7c, 0xde, 0xa7,
+  0x4f, 0x97, 0x7e, 0x9d, 0x53, 0xa7, 0x5d, 0x7e,
+  0x3a, 0x4e, 0xd5, 0x45, 0x38, 0x3a, 0x13, 0x70,
+  0xba, 0x93, 0x0b, 0x12, 0x7c, 0x8c, 0x05, 0x37,
+  0x29, 0x9d, 0xec, 0xa4, 0xe9, 0xf0, 0xa7, 0x72,
+  0x1a, 0x2f, 0x49, 0xff, 0x07, 0x5d, 0xeb, 0xae,
+  0xfe, 0xa0, 0xe9, 0xf6, 0x32, 0xdd, 0xb1, 0xd2,
+  0x76, 0xc8, 0xb3, 0xc1, 0xcd, 0xe6, 0x0d, 0xe8,
+  0x10, 0xac, 0x87, 0xca, 0x21, 0x6b, 0x91, 0xf8,
+  0xa1, 0x27, 0xa3, 0x30, 0x14, 0xf6, 0x26, 0x7c,
+  0x76, 0x10, 0x85, 0xd2, 0x3a, 0xaf, 0xe3, 0x35,
+  0x9e, 0xcb, 0x75, 0xce, 0x9f, 0xd9, 0xe1, 0xfb,
+  0xed, 0x2a, 0x74, 0xb5, 0x40, 0x3d, 0x5a, 0x90,
+  0x4f, 0x85, 0x3b, 0x90, 0xd1, 0x11, 0xcf, 0xff,
+  0x5b, 0x4a, 0xd7, 0x18, 0x18, 0xdb, 0x72, 0xb7,
+  0x53, 0xa7, 0xfc, 0xf5, 0xa0, 0x72, 0xf7, 0xf5,
+  0xce, 0x9f, 0xff, 0xe5, 0xb7, 0x7a, 0xeb, 0x60,
+  0xcb, 0xdb, 0xd6, 0xcf, 0x7e, 0x74, 0xd4, 0x30,
+  0xa9, 0xbf, 0xfc, 0xa9, 0xff, 0x9e, 0xe4, 0xb7,
+  0x9a, 0xb2, 0xd0, 0xef, 0x8d, 0x7f, 0xe2, 0xf3,
+  0xfb, 0x35, 0x61, 0x96, 0xeb, 0x9d, 0x3f, 0xff,
+  0x23, 0x87, 0x83, 0xd7, 0x70, 0xad, 0xc3, 0xbe,
+  0x3a, 0x1b, 0x8a, 0x9c, 0x70, 0xb1, 0x0c, 0x29,
+  0x59, 0x13, 0xee, 0x84, 0xa5, 0xd7, 0xdb, 0x1a,
+  0x4f, 0x85, 0x3b, 0x90, 0xd1, 0x17, 0x4f, 0xaf,
+  0xf6, 0xf0, 0x79, 0x6c, 0xf6, 0x93, 0xb0, 0xf9,
+  0xf8, 0xc2, 0x1c, 0x98, 0x43, 0xe1, 0xc5, 0x3f,
+  0xf3, 0x39, 0xee, 0xc1, 0x4e, 0xe4, 0x34, 0x4c,
+  0xd3, 0xa9, 0x5a, 0x9d, 0x39, 0x3c, 0xc3, 0xa7,
+  0x6a, 0xbd, 0x4d, 0x56, 0x74, 0xf9, 0x3a, 0xde,
+  0x68, 0xe9, 0xff, 0x9b, 0xfd, 0x7f, 0x27, 0xb6,
+  0xbe, 0x21, 0xd3, 0xff, 0xfd, 0xa7, 0x02, 0x06,
+  0x6d, 0x6d, 0x37, 0x59, 0x5e, 0x2b, 0x41, 0xd1,
+  0x88, 0xaf, 0xb2, 0x3c, 0xff, 0xfb, 0x6f, 0x05,
+  0x19, 0x5f, 0x75, 0x9d, 0xff, 0xff, 0x95, 0x3c,
+  0x9d, 0xc8, 0x68, 0xb3, 0xe7, 0xff, 0xbc, 0x36,
+  0xed, 0xd8, 0xd8, 0x32, 0xb8, 0x07, 0x4e, 0xff,
+  0xff, 0xca, 0x9f, 0xf7, 0x3e, 0xa1, 0x89, 0xb6,
+  0x09, 0x4e, 0x2f, 0xe7, 0xf9, 0x6d, 0xed, 0x83,
+  0xb9, 0xa3, 0xa7, 0xfb, 0xc1, 0xb6, 0xfd, 0xb4,
+  0xbd, 0x4e, 0x84, 0x4e, 0xcc, 0x56, 0xac, 0x57,
+  0xf3, 0x75, 0xd2, 0x9b, 0x1c, 0x4f, 0xff, 0xff,
+  0xd9, 0x9f, 0x57, 0x30, 0x35, 0xef, 0x10, 0x5c,
+  0xb3, 0xaa, 0x19, 0x43, 0x31, 0x87, 0x4e, 0xaa,
+  0xd0, 0x74, 0xed, 0x4c, 0xb1, 0xd0, 0xf4, 0x61,
+  0x56, 0x11, 0x17, 0x1c, 0x9e, 0xa7, 0xed, 0x10,
+  0xe9, 0xf5, 0x81, 0x70, 0x4c, 0x9f, 0xf7, 0x85,
+  0xf8, 0x34, 0x69, 0xdb, 0x1a, 0x20, 0xd7, 0x1a,
+  0x49, 0xf7, 0x27, 0x98, 0xa7, 0x4f, 0xcf, 0xb0,
+  0x75, 0x37, 0x3a, 0x58, 0x87, 0xa4, 0x04, 0xb3,
+  0xff, 0xfe, 0xef, 0xef, 0x96, 0xba, 0xe0, 0x53,
+  0x7c, 0x1f, 0x51, 0xcc, 0x3a, 0x1e, 0x99, 0xf6,
+  0x42, 0xb8, 0x09, 0x67, 0xe1, 0xcd, 0xab, 0x65,
+  0x3a, 0x7f, 0xff, 0x68, 0x1d, 0xaf, 0x76, 0xf0,
+  0xeb, 0xd7, 0xd4, 0xdb, 0xdf, 0x9d, 0x3f, 0xff,
+  0xd5, 0xaa, 0x8d, 0xd5, 0xcc, 0xcb, 0xd7, 0x7d,
+  0x79, 0xf8, 0x74, 0xf5, 0xb3, 0xcd, 0x8e, 0x8f,
+  0x22, 0x26, 0xcc, 0xd3, 0x33, 0x54, 0x34, 0x5f,
+  0x93, 0xff, 0x3e, 0xfa, 0x3d, 0xec, 0xbd, 0xd5,
+  0x87, 0x4f, 0xfd, 0xec, 0x0c, 0xca, 0xee, 0x7d,
+  0x58, 0x74, 0x52, 0x88, 0xaa, 0xa3, 0x4f, 0x00,
+  0x2a, 0x1d, 0x0a, 0x98, 0xbe, 0xc4, 0x79, 0x0b,
+  0x2e, 0x24, 0x9f, 0xff, 0xf9, 0xbd, 0x6d, 0xe6,
+  0x39, 0xa7, 0xf0, 0xef, 0xb7, 0xa9, 0xaa, 0x7a,
+  0x83, 0xa7, 0xda, 0x65, 0x7c, 0x07, 0x4f, 0x6f,
+  0xd3, 0xaa, 0x74, 0xff, 0xaf, 0x5f, 0xbd, 0x4d,
+  0x2f, 0xcb, 0x9d, 0x0a, 0x7c, 0xd8, 0x49, 0x33,
+  0x5a, 0x1d, 0x26, 0x1d, 0x14, 0x9a, 0x86, 0xec,
+  0x62, 0x7f, 0xff, 0xd6, 0xf5, 0x37, 0xca, 0x6e,
+  0x22, 0xb7, 0xfb, 0x78, 0x3e, 0xd8, 0x74, 0xef,
+  0xff, 0xfc, 0xa9, 0xed, 0xb6, 0xe0, 0x29, 0xc5,
+  0xfc, 0xff, 0xba, 0xc9, 0xee, 0xdd, 0x5e, 0xb1,
+  0xd0, 0xa9, 0x92, 0x21, 0x3f, 0xa1, 0x1d, 0x63,
+  0x19, 0xff, 0xb0, 0x29, 0xbe, 0x0f, 0xa8, 0xe6,
+  0x1d, 0x3e, 0xcb, 0xbd, 0x96, 0x3a, 0x14, 0xfa,
+  0xaa, 0x87, 0x37, 0xd6, 0x3a, 0x7e, 0xa1, 0xa7,
+  0xb7, 0x06, 0x83, 0xa7, 0xf6, 0xbb, 0x65, 0xed,
+  0xeb, 0x9d, 0x37, 0x84, 0xe8, 0xd5, 0x67, 0xfd,
+  0xe3, 0x4b, 0x1a, 0xcf, 0xfe, 0xdb, 0x65, 0xd8,
+  0x56, 0xfe, 0x4f, 0x6c, 0x74, 0x9c, 0xdd, 0x19,
+  0x9c, 0x5a, 0xaa, 0x38, 0xa3, 0x74, 0x15, 0xed,
+  0x0d, 0x6c, 0x8f, 0x56, 0x98, 0xc6, 0xfc, 0x6a,
+  0xd4, 0x70, 0xc2, 0x68, 0xc2, 0xcb, 0x4a, 0x09,
+  0xe4, 0x1f, 0x9e, 0x82, 0x11, 0xb5, 0x8d, 0xb2,
+  0xf0, 0xab, 0xfc, 0x87, 0x52, 0x12, 0xbb, 0xcd,
+  0x61, 0xcc, 0xe8, 0xbb, 0x53, 0x4b, 0xa7, 0xff,
+  0x39, 0x9c, 0xf7, 0x60, 0xa7, 0x72, 0x1a, 0x26,
+  0xc9, 0xfc, 0xec, 0x14, 0xee, 0x43, 0x45, 0x5b,
+  0x3f, 0x9e, 0xfd, 0x2e, 0x0a, 0xf3, 0xa7, 0xb2,
+  0xdd, 0x73, 0xa5, 0xaa, 0x61, 0xe9, 0x81, 0x9c,
+  0xf8, 0x53, 0xb9, 0x0d, 0x15, 0xa4, 0xff, 0xf2,
+  0x28, 0xe7, 0xdc, 0xce, 0x7a, 0xf9, 0x0e, 0x9f,
+  0xfe, 0x7d, 0x70, 0x15, 0x9d, 0x97, 0xba, 0xb0,
+  0xe9, 0xaf, 0x75, 0x44, 0xbf, 0x25, 0xcf, 0xe5,
+  0x6d, 0xbe, 0xe0, 0xbf, 0x1d, 0x3f, 0x51, 0x96,
+  0xf6, 0x30, 0xe9, 0xfe, 0xc6, 0xf0, 0x5f, 0xe9,
+  0x7d, 0x4e, 0x9f, 0xcf, 0xcb, 0xf0, 0x7d, 0xa1,
+  0xd2, 0x73, 0x71, 0x3f, 0x1c, 0x2b, 0xf4, 0x31,
+  0xec, 0x5b, 0xc6, 0xc0, 0x5b, 0x73, 0xc9, 0xfc,
+  0xec, 0x14, 0xee, 0x43, 0x45, 0x81, 0x3e, 0x14,
+  0xee, 0x43, 0x44, 0xeb, 0x3f, 0xff, 0xac, 0xb4,
+  0x6d, 0x8c, 0x75, 0x6b, 0x96, 0xf5, 0x74, 0xa0,
+  0xe9, 0xf3, 0x99, 0xcf, 0x76, 0x22, 0x55, 0xa3,
+  0x09, 0xf0, 0xa7, 0x72, 0x1a, 0x2d, 0x99, 0xff,
+  0x7c, 0xb5, 0x75, 0xbc, 0x9c, 0x27, 0x49, 0xd8,
+  0x7d, 0xbc, 0x61, 0x3c, 0x9d, 0xc8, 0x68, 0xb9,
+  0xa4, 0xc3, 0xa6, 0x76, 0x09, 0xbb, 0xfc, 0xae,
+  0x7f, 0x3b, 0x05, 0x3b, 0x90, 0xd1, 0x77, 0xcf,
+  0x3b, 0x5e, 0xdf, 0x1d, 0x0a, 0xda, 0x48, 0xe5,
+  0x3a, 0xd1, 0x0c, 0x29, 0x52, 0xf4, 0xa7, 0xf1,
+  0x71, 0x64, 0x34, 0x3e, 0x85, 0x6d, 0x58, 0x6e,
+  0x59, 0xbc, 0xee, 0x7f, 0xc1, 0xce, 0x5a, 0xd5,
+  0x9c, 0xf3, 0xa7, 0xf0, 0x51, 0x8d, 0xf7, 0x5d,
+  0x67, 0x4f, 0x85, 0x3b, 0x90, 0xd1, 0x2b, 0xcf,
+  0x69, 0xc2, 0xf3, 0xa7, 0xff, 0xf7, 0xaf, 0xcc,
+  0xe0, 0xfa, 0xdf, 0xf0, 0x50, 0x9e, 0xa0, 0xe9,
+  0x5b, 0x64, 0x41, 0xf1, 0x0c, 0xee, 0x7b, 0x95,
+  0x31, 0x3c, 0x37, 0xac, 0x2c, 0xe7, 0x5d, 0x76,
+  0x2a, 0x7f, 0xf5, 0xbb, 0xd7, 0x57, 0xf8, 0x68,
+  0xd3, 0xe2, 0xa7, 0xf7, 0x23, 0xb6, 0x16, 0xed,
+  0xca, 0x7d, 0x15, 0x1c, 0x93, 0x91, 0x52, 0x53,
+  0x23, 0x4f, 0x6d, 0x0a, 0xd9, 0xff, 0xce, 0x67,
+  0x3d, 0xd8, 0x29, 0xdc, 0x86, 0x89, 0x86, 0x7f,
+  0xfe, 0xc7, 0x6f, 0x1e, 0xf9, 0xda, 0xee, 0xff,
+  0xd6, 0xaf, 0x3a, 0x7f, 0xed, 0x53, 0x29, 0x7e,
+  0x9d, 0x70, 0x57, 0x9d, 0x3f, 0xc0, 0xbd, 0x45,
+  0xf5, 0xf0, 0x9d, 0x3f, 0x31, 0x70, 0x2f, 0xa8,
+  0x74, 0xf9, 0x70, 0x2f, 0xa8, 0x74, 0xfd, 0x6f,
+  0x5e, 0xbd, 0x4e, 0xe3, 0xd6, 0x61, 0x74, 0xff,
+  0xff, 0x83, 0x3f, 0x6f, 0xbe, 0x5b, 0x70, 0x65,
+  0x1e, 0xc0, 0xa5, 0xf5, 0x3a, 0x7e, 0x6d, 0xbe,
+  0xe0, 0xbf, 0x1d, 0x3f, 0xf9, 0x6f, 0xf2, 0xbf,
+  0x29, 0xbd, 0x1a, 0x7e, 0x74, 0x29, 0xff, 0xf8,
+  0xc6, 0x7e, 0xaf, 0xb5, 0xb3, 0xae, 0x74, 0xff,
+  0xff, 0x87, 0x1b, 0x28, 0x5f, 0x76, 0xf0, 0x5b,
+  0x77, 0xae, 0xb7, 0xa9, 0xd2, 0xca, 0x51, 0x3a,
+  0x25, 0xf3, 0xc0, 0xbf, 0x6f, 0x3a, 0x7b, 0xb7,
+  0xed, 0x87, 0x49, 0xcd, 0xc5, 0x67, 0x7b, 0x24,
+  0xa4, 0x23, 0x9a, 0x48, 0xb4, 0x3c, 0x02, 0x17,
+  0xd7, 0x28, 0xd0, 0x8e, 0x7c, 0x29, 0xdc, 0x86,
+  0x8a, 0xba, 0x7f, 0x9e, 0xec, 0x14, 0xee, 0x43,
+  0x44, 0x79, 0x27, 0x61, 0xf8, 0xf1, 0x84, 0xfe,
+  0x76, 0x0a, 0x77, 0x21, 0xa2, 0xc1, 0x9f, 0xce,
+  0xc1, 0x4e, 0xe4, 0x34, 0x59, 0x53, 0xf9, 0xd8,
+  0x29, 0xdc, 0x86, 0x8b, 0x4e, 0x79, 0x3b, 0x90,
+  0xd1, 0x6e, 0x4f, 0xfc, 0xb8, 0x38, 0x1b, 0xad,
+  0x94, 0xfe, 0x74, 0x09, 0xf7, 0xd4, 0xae, 0x7f,
+  0xdc, 0xf7, 0x60, 0xa7, 0x72, 0x1a, 0x28, 0x79,
+  0xf8, 0x1b, 0x98, 0x2b, 0x53, 0xa7, 0xff, 0xec,
+  0xda, 0xcb, 0xbd, 0xd7, 0x0e, 0xfa, 0xb5, 0x5f,
+  0x8a, 0x93, 0xb1, 0x1e, 0x6c, 0x21, 0xd1, 0x1b,
+  0x50, 0xba, 0x7f, 0x3b, 0x05, 0x3b, 0x90, 0xd1,
+  0x79, 0xc2, 0xaf, 0xf4, 0xbd, 0x13, 0x65, 0x2c,
+  0x97, 0x37, 0x4c, 0x3f, 0x84, 0x99, 0x87, 0x76,
+  0x3b, 0x08, 0xe7, 0x5b, 0x23, 0x4f, 0xe7, 0x60,
+  0xa7, 0x72, 0x1a, 0x29, 0x69, 0xfc, 0xec, 0x14,
+  0xee, 0x43, 0x45, 0x85, 0x3f, 0x9d, 0x82, 0x9d,
+  0xc8, 0x68, 0xb2, 0xe7, 0xff, 0x39, 0x9c, 0xf7,
+  0x60, 0xa7, 0x72, 0x1a, 0x28, 0xc9, 0xfc, 0xe5,
+  0x6c, 0xa2, 0xbf, 0x1d, 0x0f, 0x4c, 0xd8, 0x4e,
+  0xd8, 0x77, 0x53, 0xbb, 0xa9, 0x4f, 0xfc, 0xee,
+  0x7b, 0xb0, 0x53, 0xb9, 0x0d, 0x11, 0xcc, 0xff,
+  0xe7, 0x33, 0x9e, 0xec, 0x14, 0xee, 0x43, 0x44,
+  0xe5, 0x3f, 0x9d, 0x82, 0x9d, 0xc8, 0x68, 0xb3,
+  0x27, 0xf3, 0xb0, 0x53, 0xb9, 0x0d, 0x16, 0xec,
+  0xff, 0xe7, 0x33, 0x9e, 0xec, 0x14, 0xee, 0x43,
+  0x45, 0x21, 0x3f, 0xf3, 0xb9, 0xee, 0xc1, 0x4e,
+  0xe4, 0x34, 0x4a, 0x51, 0x42, 0x76, 0x4d, 0x26,
+  0x31, 0x48, 0x0e, 0xee, 0x76, 0xde, 0xa5, 0x3f,
+  0xee, 0x7b, 0xb0, 0x53, 0xb9, 0x0d, 0x13, 0xb4,
+  0xff, 0xfb, 0xdb, 0x68, 0xc5, 0x6f, 0xed, 0x81,
+  0x43, 0x10, 0xe9, 0x39, 0x88, 0x9d, 0xe4, 0x69,
+  0xff, 0xb9, 0x96, 0xc4, 0xeb, 0x2e, 0xf7, 0x9d,
+  0x3f, 0xf0, 0x65, 0xba, 0x8c, 0xa8, 0x75, 0x27,
+  0x4d, 0xa8, 0xed, 0x91, 0x0b, 0x54, 0x38, 0x62,
+  0x38, 0x35, 0x21, 0x5b, 0x3e, 0x14, 0xee, 0x43,
+  0x44, 0x59, 0x3f, 0xee, 0x7b, 0xb0, 0x53, 0xb9,
+  0x0d, 0x12, 0xec, 0xff, 0xfd, 0x9b, 0x59, 0x77,
+  0xba, 0xe1, 0xdf, 0x56, 0xab, 0xf1, 0x52, 0x76,
+  0x23, 0x51, 0x86, 0x1a, 0x88, 0xd3, 0xff, 0x9c,
+  0xce, 0x7b, 0xb0, 0x53, 0xb9, 0x0d, 0x13, 0x14,
+  0xfe, 0x76, 0x0a, 0x77, 0x21, 0xa2, 0xa9, 0x9f,
+  0xfc, 0xe6, 0x73, 0xdd, 0x82, 0x9d, 0xc8, 0x68,
+  0x9d, 0x27, 0xf7, 0xb8, 0x55, 0xfc, 0xd8, 0xe9,
+  0xf3, 0x4a, 0xd2, 0xd4, 0xe9, 0xfb, 0xfc, 0xf3,
+  0x6c, 0x03, 0xa7, 0xbd, 0x65, 0x77, 0x8f, 0x5a,
+  0xa5, 0x13, 0xff, 0x69, 0x5b, 0xad, 0x2e, 0xd1,
+  0xaf, 0x30, 0xe8, 0x62, 0x20, 0xac, 0x73, 0x3f,
+  0xee, 0x7b, 0xb0, 0x53, 0xb9, 0x0d, 0x13, 0xbc,
+  0xfa, 0xfa, 0x73, 0x3c, 0x54, 0x9d, 0xb2, 0x73,
+  0x79, 0x18, 0x53, 0x08, 0xf9, 0x1a, 0x7f, 0xf3,
+  0x99, 0xcf, 0x76, 0x0a, 0x77, 0x21, 0xa2, 0x85,
+  0x9f, 0xfc, 0xe6, 0x73, 0xdd, 0x82, 0x9d, 0xc8,
+  0x68, 0xa4, 0xa7, 0xff, 0xf6, 0x55, 0xdb, 0xf1,
+  0xab, 0x73, 0x2f, 0x65, 0xbe, 0x8c, 0x3a, 0x28,
+  0x5c, 0x03, 0x79, 0xc2, 0x29, 0x09, 0xdb, 0x23,
+  0xed, 0xf9, 0x27, 0x45, 0x2d, 0x45, 0x29, 0xfc,
+  0xec, 0x14, 0xee, 0x43, 0x44, 0x49, 0x3f, 0xf9,
+  0xcc, 0xe7, 0xbb, 0x05, 0x3b, 0x90, 0xd1, 0x2f,
+  0x4f, 0x85, 0x3b, 0x90, 0xd1, 0x4b, 0xcf, 0xe5,
+  0xd9, 0xbf, 0xcc, 0x5a, 0x9d, 0x27, 0x61, 0xf3,
+  0x5c, 0xc2, 0x7f, 0x3b, 0x05, 0x3b, 0x90, 0xd1,
+  0x4e, 0x4f, 0xfb, 0xc3, 0xd5, 0xb6, 0x60, 0x21,
+  0xd3, 0xfe, 0xcb, 0x28, 0xe3, 0xbf, 0xff, 0xf2,
+  0xa6, 0xf7, 0xe7, 0x4d, 0x43, 0xb6, 0x44, 0x86,
+  0xa1, 0xd3, 0x79, 0xfc, 0xf8, 0x53, 0xb9, 0x0d,
+  0x15, 0xe4, 0xff, 0xfd, 0x9b, 0x59, 0x77, 0xba,
+  0xe1, 0xdf, 0x56, 0xab, 0xf1, 0x52, 0x76, 0x22,
+  0x3b, 0x50, 0xc2, 0x7f, 0xe7, 0x73, 0xdd, 0x82,
+  0x9d, 0xc8, 0x68, 0x91, 0xe7, 0x7b, 0xe5, 0x3a,
+  0x72, 0x63, 0x0a, 0x71, 0x79, 0x3e, 0x14, 0xee,
+  0x43, 0x44, 0x91, 0x3c, 0xee, 0x7b, 0x94, 0xf6,
+  0x70, 0xa6, 0x7f, 0xe7, 0x73, 0xdd, 0x82, 0x9d,
+  0xc8, 0x68, 0x92, 0xa7, 0xc2, 0x9d, 0xc8, 0x68,
+  0xbc, 0x67, 0xed, 0x02, 0x9e, 0xa6, 0xa7, 0x4f,
+  0xab, 0x5b, 0xe2, 0x1d, 0x3f, 0xcf, 0x76, 0x0a,
+  0x77, 0x21, 0xa2, 0x4d, 0x93, 0xb1, 0x18, 0xd4,
+  0x98, 0x09, 0x7f, 0x13, 0x42, 0xae, 0x96, 0xd0,
+  0x76, 0xf8, 0x5c, 0x6c, 0x4f, 0xe8, 0x65, 0xb5,
+  0x0d, 0x26, 0x15, 0xda, 0x18, 0x37, 0x37, 0xd2,
+  0x31, 0x28, 0x58, 0xda, 0x44, 0xe8, 0x8e, 0xc1,
+  0xf1, 0xe4, 0x6d, 0x1e, 0xd6, 0x5b, 0x93, 0xcd,
+  0x72, 0x95, 0xd2, 0xbe, 0xd6, 0xa6, 0x79, 0xe3,
+  0xd3, 0x98, 0xfa, 0xb8, 0xec, 0x1a, 0xa6, 0xa9,
+  0x8d, 0x23, 0xa5, 0x98, 0x89, 0xd9, 0xb4, 0xed,
+  0x1f, 0x53, 0x9c, 0xfe, 0x96, 0x1a, 0xdd, 0xc2,
+  0xc4, 0x27, 0x90, 0xeb, 0x49, 0x34, 0xbd, 0x72,
+  0x39, 0xa5, 0x2b, 0xa9, 0xb4, 0x7a, 0xdf, 0xc7,
+  0xf9, 0xa9, 0x1e, 0xce, 0xf9, 0xd0, 0x26, 0xf9,
+  0xda, 0xb8,
 };
 
-static const unsigned kPreloadedHSTSBits = 88926;
+static const unsigned kPreloadedHSTSBits = 94351;
 
-static const unsigned kHSTSRootPosition = 88354;
+static const unsigned kHSTSRootPosition = 93775;
 
 #endif // NET_HTTP_TRANSPORT_SECURITY_STATE_STATIC_H_
diff --git a/net/http/transport_security_state_static.json b/net/http/transport_security_state_static.json
index 06ad361..4522033 100644
--- a/net/http/transport_security_state_static.json
+++ b/net/http/transport_security_state_static.json
@@ -177,6 +177,15 @@
         "ThawtePrimaryRootCA_G3",
         "ThawtePrimaryRootCA"
       ]
+    },
+    {
+      "name": "facebook",
+      "static_spki_hashes": [
+        "SymantecClass3EVG3",
+        "DigiCertECCSecureServerCA",
+        "DigiCertEVRoot",
+        "FacebookBackup"
+      ]
     }
   ],
 
@@ -1382,7 +1391,85 @@
     { "name": "southside-crew.com", "include_subdomains": true, "mode": "force-https" },
     { "name": "tickopa.co.uk", "include_subdomains": true, "mode": "force-https" },
     { "name": "wieninternational.at", "include_subdomains": true, "mode": "force-https" },
-    { "name": "fleximus.org", "include_subdomains": true, "mode": "force-https" }
+    { "name": "fleximus.org", "include_subdomains": true, "mode": "force-https" },
+
+    // Facebook would like to have pinning enforced on (*.)facebook.com and
+    // HSTS enforced on specific names. We can't (yet) represent that in JSON
+    // So we're currently only applying pinning on the specific names.
+    { "name": "facebook.com", "mode": "force-https", "pins": "facebook" },
+    { "name": "www.facebook.com", "include_subdomains": true, "mode": "force-https", "pins": "facebook" },
+    { "name": "m.facebook.com", "include_subdomains": true, "mode": "force-https", "pins": "facebook" },
+    { "name": "tablet.facebook.com", "include_subdomains": true, "mode": "force-https", "pins": "facebook" },
+    { "name": "secure.facebook.com", "include_subdomains": true, "mode": "force-https", "pins": "facebook" },
+    { "name": "pixel.facebook.com", "include_subdomains": true, "mode": "force-https", "pins": "facebook" },
+    { "name": "apps.facebook.com", "include_subdomains": true, "mode": "force-https", "pins": "facebook" },
+    { "name": "upload.facebook.com", "include_subdomains": true, "mode": "force-https", "pins": "facebook" },
+    { "name": "developers.facebook.com", "include_subdomains": true, "mode": "force-https", "pins": "facebook" },
+    { "name": "touch.facebook.com", "include_subdomains": true, "mode": "force-https", "pins": "facebook" },
+    { "name": "mbasic.facebook.com", "include_subdomains": true, "mode": "force-https", "pins": "facebook" },
+    { "name": "code.facebook.com", "include_subdomains": true, "mode": "force-https", "pins": "facebook" },
+    { "name": "t.facebook.com", "include_subdomains": true, "mode": "force-https", "pins": "facebook" },
+    { "name": "mtouch.facebook.com", "include_subdomains": true, "mode": "force-https", "pins": "facebook" },
+    { "name": "business.facebook.com", "include_subdomains": true, "mode": "force-https", "pins": "facebook" },
+    { "name": "research.facebook.com", "include_subdomains": true, "mode": "force-https", "pins": "facebook" },
+
+    { "name": "0x0a.net", "include_subdomains": true, "mode": "force-https" },
+    { "name": "animurecs.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "arendburgers.nl", "include_subdomains": true, "mode": "force-https" },
+    { "name": "big-andy.co.uk", "include_subdomains": true, "mode": "force-https" },
+    { "name": "bitgo.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "buttercoin.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "chainmonitor.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "coinapult.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "comssa.org.au", "include_subdomains": true, "mode": "force-https" },
+    { "name": "coursella.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "crowdjuris.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "curlybracket.co.uk", "include_subdomains": true, "mode": "force-https" },
+    { "name": "cyanogenmod.xxx", "include_subdomains": true, "mode": "force-https" },
+    { "name": "czbix.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "dealcruiser.nl", "include_subdomains": true, "mode": "force-https" },
+    { "name": "derevtsov.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "dzlibs.io", "include_subdomains": true, "mode": "force-https" },
+    { "name": "easysimplecrm.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "fralef.me", "include_subdomains": true, "mode": "force-https" },
+    { "name": "glossopnorthendafc.co.uk", "include_subdomains": true, "mode": "force-https" },
+    { "name": "gtraxapp.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "hansvaneijsden.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "horseboners.xxx", "include_subdomains": true, "mode": "force-https" },
+    { "name": "horza.org", "include_subdomains": true, "mode": "force-https" },
+    { "name": "iamcarrico.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "kartonmodellbau.org", "include_subdomains": true, "mode": "force-https" },
+    { "name": "keycdn.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "komandakovalchuk.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "kryptera.se", "include_subdomains": true, "mode": "force-https" },
+    { "name": "lukonet.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "meetfinch.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "megaxchange.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "moriz.de", "include_subdomains": true, "mode": "force-https" },
+    { "name": "myplaceonline.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "nectarleaf.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "nos-oignons.net", "include_subdomains": true, "mode": "force-https" },
+    { "name": "phoenixlogan.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "redteam-pentesting.de", "include_subdomains": true, "mode": "force-https" },
+    { "name": "roland.io", "include_subdomains": true, "mode": "force-https" },
+    { "name": "servergno.me", "include_subdomains": true, "mode": "force-https" },
+    { "name": "siriad.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "smartcoin.com.br", "include_subdomains": true, "mode": "force-https" },
+    { "name": "spartantheatre.org", "include_subdomains": true, "mode": "force-https" },
+    { "name": "spencerbaer.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "stretchmyan.us", "include_subdomains": true, "mode": "force-https" },
+    { "name": "taxsquirrel.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "techhipster.net", "include_subdomains": true, "mode": "force-https" },
+    { "name": "timtaubert.de", "include_subdomains": true, "mode": "force-https" },
+    { "name": "tribut.de", "include_subdomains": true, "mode": "force-https" },
+    { "name": "triop.se", "include_subdomains": true, "mode": "force-https" },
+    { "name": "twentymilliseconds.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "ukdefencejournal.org.uk", "include_subdomains": true, "mode": "force-https" },
+    { "name": "ukhas.net", "include_subdomains": true, "mode": "force-https" },
+    { "name": "vpnzoom.com", "include_subdomains": true, "mode": "force-https" },
+    { "name": "watsonhall.uk", "include_subdomains": true, "mode": "force-https" },
+    { "name": "weblogzwolle.nl", "include_subdomains": true, "mode": "force-https" },
+    { "name": "ypart.eu", "include_subdomains": true, "mode": "force-https" }
   ],
 
   // |ReportUMAOnPinFailure| uses these to report which domain was associated
@@ -1643,6 +1730,7 @@
     "GOOGLETAGSERVICES_COM",
     "DROPBOX_COM",
     "YOUTUBE_NOCOOKIE_COM",
-    "2MDN_NET"
+    "2MDN_NET",
+    "FACEBOOK_COM"
   ]
 }
diff --git a/net/http/transport_security_state_unittest.cc b/net/http/transport_security_state_unittest.cc
index 8a2ebe8..eb72050 100644
--- a/net/http/transport_security_state_unittest.cc
+++ b/net/http/transport_security_state_unittest.cc
@@ -39,7 +39,7 @@
 
 class TransportSecurityStateTest : public testing::Test {
  public:
-  virtual void SetUp() {
+  void SetUp() override {
 #if defined(USE_OPENSSL)
     crypto::EnsureOpenSSLInit();
 #else
diff --git a/net/net.gyp b/net/net.gyp
index e570e8e..f762ad6 100644
--- a/net/net.gyp
+++ b/net/net.gyp
@@ -789,6 +789,11 @@
             ],
           },
         ],
+        ['v8_use_external_startup_data==1', {
+          'dependencies': [
+            '../gin/gin.gyp:gin',
+          ]
+        }],
       ],
       'target_conditions': [
         # These source files are excluded by default platform rules, but they
@@ -1651,6 +1656,23 @@
           ],
           'variables': {
             'test_suite_name': 'net_unittests',
+            'conditions': [
+              ['v8_use_external_startup_data==1', {
+                'additional_input_paths': [
+                  '<(PRODUCT_DIR)/natives_blob.bin',
+                  '<(PRODUCT_DIR)/snapshot_blob.bin',
+                ],
+                'copies': [
+                  {
+                  'destination': '<(PRODUCT_DIR)/net_unittests_apk/assets',
+                    'files': [
+                      '<(PRODUCT_DIR)/natives_blob.bin',
+                      '<(PRODUCT_DIR)/snapshot_blob.bin',
+                    ],
+                  },
+                ],
+              }],
+            ],
           },
           'includes': [ '../build/apk_test.gypi' ],
         },
diff --git a/net/net.gypi b/net/net.gypi
index 36aa3e6..01b0d56 100644
--- a/net/net.gypi
+++ b/net/net.gypi
@@ -313,6 +313,7 @@
       'cert/cert_verify_proc_win.h',
       'cert/crl_set_storage.cc',
       'cert/crl_set_storage.h',
+      'cert/ct_ev_whitelist.h',
       'cert/ct_known_logs.cc',
       'cert/ct_known_logs.h',
       'cert/ct_known_logs_static.h',
diff --git a/net/net.isolate b/net/net.isolate
index f5ca9b5..cd2d266 100644
--- a/net/net.isolate
+++ b/net/net.isolate
@@ -6,5 +6,6 @@
   ],
   'includes': [
     '../base/base.isolate',
+    '../gin/v8.isolate',
   ],
 }
diff --git a/net/net_unittests.isolate b/net/net_unittests.isolate
index 15b3f08..e57f957 100644
--- a/net/net_unittests.isolate
+++ b/net/net_unittests.isolate
@@ -42,5 +42,6 @@
   ],
   'includes': [
     '../base/base.isolate',
+    '../gin/v8.isolate',
   ],
 }
diff --git a/net/ocsp/nss_ocsp.cc b/net/ocsp/nss_ocsp.cc
index 02eb2c7..61c65ee 100644
--- a/net/ocsp/nss_ocsp.cc
+++ b/net/ocsp/nss_ocsp.cc
@@ -283,9 +283,9 @@
     return data_;
   }
 
-  virtual void OnReceivedRedirect(URLRequest* request,
-                                  const RedirectInfo& redirect_info,
-                                  bool* defer_redirect) override {
+  void OnReceivedRedirect(URLRequest* request,
+                          const RedirectInfo& redirect_info,
+                          bool* defer_redirect) override {
     DCHECK_EQ(request_.get(), request);
     DCHECK_EQ(base::MessageLoopForIO::current(), io_loop_);
 
@@ -296,7 +296,7 @@
     }
   }
 
-  virtual void OnResponseStarted(URLRequest* request) override {
+  void OnResponseStarted(URLRequest* request) override {
     DCHECK_EQ(request_.get(), request);
     DCHECK_EQ(base::MessageLoopForIO::current(), io_loop_);
 
@@ -310,8 +310,7 @@
     OnReadCompleted(request_.get(), bytes_read);
   }
 
-  virtual void OnReadCompleted(URLRequest* request,
-                               int bytes_read) override {
+  void OnReadCompleted(URLRequest* request, int bytes_read) override {
     DCHECK_EQ(request_.get(), request);
     DCHECK_EQ(base::MessageLoopForIO::current(), io_loop_);
 
@@ -359,7 +358,7 @@
  private:
   friend class base::RefCountedThreadSafe<OCSPRequestSession>;
 
-  virtual ~OCSPRequestSession() {
+  ~OCSPRequestSession() override {
     // When this destructor is called, there should be only one thread that has
     // a reference to this object, and so that thread doesn't need to lock
     // |lock_| here.
diff --git a/net/ocsp/nss_ocsp_unittest.cc b/net/ocsp/nss_ocsp_unittest.cc
index acbb785..745741e 100644
--- a/net/ocsp/nss_ocsp_unittest.cc
+++ b/net/ocsp/nss_ocsp_unittest.cc
@@ -44,10 +44,10 @@
  public:
   AiaResponseHandler(const std::string& headers, const std::string& cert_data)
       : headers_(headers), cert_data_(cert_data), request_count_(0) {}
-  virtual ~AiaResponseHandler() {}
+  ~AiaResponseHandler() override {}
 
   // net::URLRequestInterceptor implementation:
-  virtual net::URLRequestJob* MaybeInterceptRequest(
+  net::URLRequestJob* MaybeInterceptRequest(
       net::URLRequest* request,
       net::NetworkDelegate* network_delegate) const override {
     ++const_cast<AiaResponseHandler*>(this)->request_count_;
@@ -75,9 +75,9 @@
         handler_(NULL),
         verify_proc_(new CertVerifyProcNSS),
         verifier_(new MultiThreadedCertVerifier(verify_proc_.get())) {}
-  virtual ~NssHttpTest() {}
+  ~NssHttpTest() override {}
 
-  virtual void SetUp() {
+  void SetUp() override {
     std::string file_contents;
     ASSERT_TRUE(base::ReadFileToString(
         GetTestCertsDirectory().AppendASCII("aia-intermediate.der"),
@@ -97,7 +97,7 @@
     EnsureNSSHttpIOInit();
   }
 
-  virtual void TearDown() {
+  void TearDown() override {
     ShutdownNSSHttpIO();
 
     if (handler_)
diff --git a/net/proxy/proxy_config_service_linux.cc b/net/proxy/proxy_config_service_linux.cc
index 145312e..e0a9372 100644
--- a/net/proxy/proxy_config_service_linux.cc
+++ b/net/proxy/proxy_config_service_linux.cc
@@ -206,7 +206,7 @@
         notify_delegate_(NULL) {
   }
 
-  virtual ~SettingGetterImplGConf() {
+  ~SettingGetterImplGConf() override {
     // client_ should have been released before now, from
     // Delegate::OnDestroy(), while running on the UI thread. However
     // on exiting the process, it may happen that Delegate::OnDestroy()
@@ -232,9 +232,8 @@
     DCHECK(!client_);
   }
 
-  virtual bool Init(
-      const scoped_refptr<base::SingleThreadTaskRunner>& glib_task_runner,
-      const scoped_refptr<base::SingleThreadTaskRunner>& file_task_runner)
+  bool Init(const scoped_refptr<base::SingleThreadTaskRunner>& glib_task_runner,
+            const scoped_refptr<base::SingleThreadTaskRunner>& file_task_runner)
       override {
     DCHECK(glib_task_runner->BelongsToCurrentThread());
     DCHECK(!client_);
@@ -273,7 +272,7 @@
     return true;
   }
 
-  virtual void ShutDown() override {
+  void ShutDown() override {
     if (client_) {
       DCHECK(task_runner_->BelongsToCurrentThread());
       // We must explicitly disable gconf notifications here, because the gconf
@@ -290,7 +289,7 @@
     }
   }
 
-  virtual bool SetUpNotifications(
+  bool SetUpNotifications(
       ProxyConfigServiceLinux::Delegate* delegate) override {
     DCHECK(client_);
     DCHECK(task_runner_->BelongsToCurrentThread());
@@ -320,16 +319,16 @@
     return true;
   }
 
-  virtual const scoped_refptr<base::SingleThreadTaskRunner>&
-  GetNotificationTaskRunner() override {
+  const scoped_refptr<base::SingleThreadTaskRunner>& GetNotificationTaskRunner()
+      override {
     return task_runner_;
   }
 
-  virtual ProxyConfigSource GetConfigSource() override {
+  ProxyConfigSource GetConfigSource() override {
     return PROXY_CONFIG_SOURCE_GCONF;
   }
 
-  virtual bool GetString(StringSetting key, std::string* result) override {
+  bool GetString(StringSetting key, std::string* result) override {
     switch (key) {
       case PROXY_MODE:
         return GetStringByPath("/system/proxy/mode", result);
@@ -346,7 +345,7 @@
     }
     return false;  // Placate compiler.
   }
-  virtual bool GetBool(BoolSetting key, bool* result) override {
+  bool GetBool(BoolSetting key, bool* result) override {
     switch (key) {
       case PROXY_USE_HTTP_PROXY:
         return GetBoolByPath("/system/http_proxy/use_http_proxy", result);
@@ -357,7 +356,7 @@
     }
     return false;  // Placate compiler.
   }
-  virtual bool GetInt(IntSetting key, int* result) override {
+  bool GetInt(IntSetting key, int* result) override {
     switch (key) {
       case PROXY_HTTP_PORT:
         return GetIntByPath("/system/http_proxy/port", result);
@@ -370,8 +369,8 @@
     }
     return false;  // Placate compiler.
   }
-  virtual bool GetStringList(StringListSetting key,
-                             std::vector<std::string>* result) override {
+  bool GetStringList(StringListSetting key,
+                     std::vector<std::string>* result) override {
     switch (key) {
       case PROXY_IGNORE_HOSTS:
         return GetStringListByPath("/system/http_proxy/ignore_hosts", result);
@@ -379,14 +378,12 @@
     return false;  // Placate compiler.
   }
 
-  virtual bool BypassListIsReversed() override {
+  bool BypassListIsReversed() override {
     // This is a KDE-specific setting.
     return false;
   }
 
-  virtual bool MatchHostsUsingSuffixMatching() override {
-    return false;
-  }
+  bool MatchHostsUsingSuffixMatching() override { return false; }
 
  private:
   bool GetStringByPath(const char* key, std::string* result) {
@@ -529,7 +526,7 @@
     notify_delegate_(NULL) {
   }
 
-  virtual ~SettingGetterImplGSettings() {
+  ~SettingGetterImplGSettings() override {
     // client_ should have been released before now, from
     // Delegate::OnDestroy(), while running on the UI thread. However
     // on exiting the process, it may happen that
@@ -565,9 +562,8 @@
   // LoadAndCheckVersion() must be called *before* Init()!
   bool LoadAndCheckVersion(base::Environment* env);
 
-  virtual bool Init(
-      const scoped_refptr<base::SingleThreadTaskRunner>& glib_task_runner,
-      const scoped_refptr<base::SingleThreadTaskRunner>& file_task_runner)
+  bool Init(const scoped_refptr<base::SingleThreadTaskRunner>& glib_task_runner,
+            const scoped_refptr<base::SingleThreadTaskRunner>& file_task_runner)
       override {
     DCHECK(glib_task_runner->BelongsToCurrentThread());
     DCHECK(!client_);
@@ -589,7 +585,7 @@
     return true;
   }
 
-  virtual void ShutDown() override {
+  void ShutDown() override {
     if (client_) {
       DCHECK(task_runner_->BelongsToCurrentThread());
       // This also disables gsettings notifications.
@@ -604,7 +600,7 @@
     }
   }
 
-  virtual bool SetUpNotifications(
+  bool SetUpNotifications(
       ProxyConfigServiceLinux::Delegate* delegate) override {
     DCHECK(client_);
     DCHECK(task_runner_->BelongsToCurrentThread());
@@ -627,16 +623,16 @@
     return true;
   }
 
-  virtual const scoped_refptr<base::SingleThreadTaskRunner>&
-  GetNotificationTaskRunner() override {
+  const scoped_refptr<base::SingleThreadTaskRunner>& GetNotificationTaskRunner()
+      override {
     return task_runner_;
   }
 
-  virtual ProxyConfigSource GetConfigSource() override {
+  ProxyConfigSource GetConfigSource() override {
     return PROXY_CONFIG_SOURCE_GSETTINGS;
   }
 
-  virtual bool GetString(StringSetting key, std::string* result) override {
+  bool GetString(StringSetting key, std::string* result) override {
     DCHECK(client_);
     switch (key) {
       case PROXY_MODE:
@@ -654,7 +650,7 @@
     }
     return false;  // Placate compiler.
   }
-  virtual bool GetBool(BoolSetting key, bool* result) override {
+  bool GetBool(BoolSetting key, bool* result) override {
     DCHECK(client_);
     switch (key) {
       case PROXY_USE_HTTP_PROXY:
@@ -672,7 +668,7 @@
     }
     return false;  // Placate compiler.
   }
-  virtual bool GetInt(IntSetting key, int* result) override {
+  bool GetInt(IntSetting key, int* result) override {
     DCHECK(client_);
     switch (key) {
       case PROXY_HTTP_PORT:
@@ -686,8 +682,8 @@
     }
     return false;  // Placate compiler.
   }
-  virtual bool GetStringList(StringListSetting key,
-                             std::vector<std::string>* result) override {
+  bool GetStringList(StringListSetting key,
+                     std::vector<std::string>* result) override {
     DCHECK(client_);
     switch (key) {
       case PROXY_IGNORE_HOSTS:
@@ -696,14 +692,12 @@
     return false;  // Placate compiler.
   }
 
-  virtual bool BypassListIsReversed() override {
+  bool BypassListIsReversed() override {
     // This is a KDE-specific setting.
     return false;
   }
 
-  virtual bool MatchHostsUsingSuffixMatching() override {
-    return false;
-  }
+  bool MatchHostsUsingSuffixMatching() override { return false; }
 
  private:
   bool GetStringByPath(GSettings* client, const char* key,
@@ -916,7 +910,7 @@
     }
   }
 
-  virtual ~SettingGetterImplKDE() {
+  ~SettingGetterImplKDE() override {
     // inotify_fd_ should have been closed before now, from
     // Delegate::OnDestroy(), while running on the file thread. However
     // on exiting the process, it may happen that Delegate::OnDestroy()
@@ -929,9 +923,8 @@
     DCHECK(inotify_fd_ < 0);
   }
 
-  virtual bool Init(
-      const scoped_refptr<base::SingleThreadTaskRunner>& glib_task_runner,
-      const scoped_refptr<base::SingleThreadTaskRunner>& file_task_runner)
+  bool Init(const scoped_refptr<base::SingleThreadTaskRunner>& glib_task_runner,
+            const scoped_refptr<base::SingleThreadTaskRunner>& file_task_runner)
       override {
     // This has to be called on the UI thread (http://crbug.com/69057).
     base::ThreadRestrictions::ScopedAllowIO allow_io;
@@ -956,7 +949,7 @@
     return true;
   }
 
-  virtual void ShutDown() override {
+  void ShutDown() override {
     if (inotify_fd_ >= 0) {
       ResetCachedSettings();
       inotify_watcher_.StopWatchingFileDescriptor();
@@ -965,7 +958,7 @@
     }
   }
 
-  virtual bool SetUpNotifications(
+  bool SetUpNotifications(
       ProxyConfigServiceLinux::Delegate* delegate) override {
     DCHECK(inotify_fd_ >= 0);
     DCHECK(file_task_runner_->BelongsToCurrentThread());
@@ -989,42 +982,40 @@
     return true;
   }
 
-  virtual const scoped_refptr<base::SingleThreadTaskRunner>&
-  GetNotificationTaskRunner() override {
+  const scoped_refptr<base::SingleThreadTaskRunner>& GetNotificationTaskRunner()
+      override {
     return file_task_runner_;
   }
 
   // Implement base::MessagePumpLibevent::Watcher.
-  virtual void OnFileCanReadWithoutBlocking(int fd) override {
+  void OnFileCanReadWithoutBlocking(int fd) override {
     DCHECK_EQ(fd, inotify_fd_);
     DCHECK(file_task_runner_->BelongsToCurrentThread());
     OnChangeNotification();
   }
-  virtual void OnFileCanWriteWithoutBlocking(int fd) override {
-    NOTREACHED();
-  }
+  void OnFileCanWriteWithoutBlocking(int fd) override { NOTREACHED(); }
 
-  virtual ProxyConfigSource GetConfigSource() override {
+  ProxyConfigSource GetConfigSource() override {
     return PROXY_CONFIG_SOURCE_KDE;
   }
 
-  virtual bool GetString(StringSetting key, std::string* result) override {
+  bool GetString(StringSetting key, std::string* result) override {
     string_map_type::iterator it = string_table_.find(key);
     if (it == string_table_.end())
       return false;
     *result = it->second;
     return true;
   }
-  virtual bool GetBool(BoolSetting key, bool* result) override {
+  bool GetBool(BoolSetting key, bool* result) override {
     // We don't ever have any booleans.
     return false;
   }
-  virtual bool GetInt(IntSetting key, int* result) override {
+  bool GetInt(IntSetting key, int* result) override {
     // We don't ever have any integers. (See AddProxy() below about ports.)
     return false;
   }
-  virtual bool GetStringList(StringListSetting key,
-                             std::vector<std::string>* result) override {
+  bool GetStringList(StringListSetting key,
+                     std::vector<std::string>* result) override {
     strings_map_type::iterator it = strings_table_.find(key);
     if (it == strings_table_.end())
       return false;
@@ -1032,13 +1023,9 @@
     return true;
   }
 
-  virtual bool BypassListIsReversed() override {
-    return reversed_bypass_list_;
-  }
+  bool BypassListIsReversed() override { return reversed_bypass_list_; }
 
-  virtual bool MatchHostsUsingSuffixMatching() override {
-    return true;
-  }
+  bool MatchHostsUsingSuffixMatching() override { return true; }
 
  private:
   void ResetCachedSettings() {
diff --git a/net/proxy/proxy_config_service_linux.h b/net/proxy/proxy_config_service_linux.h
index a8438c2..3d05898 100644
--- a/net/proxy/proxy_config_service_linux.h
+++ b/net/proxy/proxy_config_service_linux.h
@@ -280,7 +280,7 @@
   ProxyConfigServiceLinux(base::Environment* env_var_getter,
                           SettingGetter* setting_getter);
 
-  virtual ~ProxyConfigServiceLinux();
+  ~ProxyConfigServiceLinux() override;
 
   void SetupAndFetchInitialConfig(
       const scoped_refptr<base::SingleThreadTaskRunner>& glib_task_runner,
@@ -296,9 +296,9 @@
 
   // ProxyConfigService methods:
   // Called from IO thread.
-  virtual void AddObserver(Observer* observer) override;
-  virtual void RemoveObserver(Observer* observer) override;
-  virtual ProxyConfigService::ConfigAvailability GetLatestProxyConfig(
+  void AddObserver(Observer* observer) override;
+  void RemoveObserver(Observer* observer) override;
+  ProxyConfigService::ConfigAvailability GetLatestProxyConfig(
       ProxyConfig* config) override;
 
  private:
diff --git a/net/proxy/proxy_config_service_linux_unittest.cc b/net/proxy/proxy_config_service_linux_unittest.cc
index 3e6b966..2c1995c 100644
--- a/net/proxy/proxy_config_service_linux_unittest.cc
+++ b/net/proxy/proxy_config_service_linux_unittest.cc
@@ -107,7 +107,7 @@
   }
 
   // Begin base::Environment implementation.
-  virtual bool GetVar(const char* variable_name, std::string* result) override {
+  bool GetVar(const char* variable_name, std::string* result) override {
     std::map<std::string, const char**>::iterator it =
         table.find(variable_name);
     if (it != table.end() && *(it->second) != NULL) {
@@ -118,13 +118,13 @@
     return false;
   }
 
-  virtual bool SetVar(const char* variable_name, const std::string& new_value)
-      override {
+  bool SetVar(const char* variable_name,
+              const std::string& new_value) override {
     ADD_FAILURE();
     return false;
   }
 
-  virtual bool UnSetVar(const char* variable_name) override {
+  bool UnSetVar(const char* variable_name) override {
     ADD_FAILURE();
     return false;
   }
@@ -175,31 +175,30 @@
     values = zero_values;
   }
 
-  virtual bool Init(
-      const scoped_refptr<base::SingleThreadTaskRunner>& glib_task_runner,
-      const scoped_refptr<base::SingleThreadTaskRunner>& file_task_runner)
+  bool Init(const scoped_refptr<base::SingleThreadTaskRunner>& glib_task_runner,
+            const scoped_refptr<base::SingleThreadTaskRunner>& file_task_runner)
       override {
     task_runner_ = glib_task_runner;
     return true;
   }
 
-  virtual void ShutDown() override {}
+  void ShutDown() override {}
 
-  virtual bool SetUpNotifications(ProxyConfigServiceLinux::Delegate* delegate)
-      override {
+  bool SetUpNotifications(
+      ProxyConfigServiceLinux::Delegate* delegate) override {
     return true;
   }
 
-  virtual const scoped_refptr<base::SingleThreadTaskRunner>&
-  GetNotificationTaskRunner() override {
+  const scoped_refptr<base::SingleThreadTaskRunner>& GetNotificationTaskRunner()
+      override {
     return task_runner_;
   }
 
-  virtual ProxyConfigSource GetConfigSource() override {
+  ProxyConfigSource GetConfigSource() override {
     return PROXY_CONFIG_SOURCE_TEST;
   }
 
-  virtual bool GetString(StringSetting key, std::string* result) override {
+  bool GetString(StringSetting key, std::string* result) override {
     const char* value = strings_table.Get(key);
     if (value) {
       *result = value;
@@ -208,7 +207,7 @@
     return false;
   }
 
-  virtual bool GetBool(BoolSetting key, bool* result) override {
+  bool GetBool(BoolSetting key, bool* result) override {
     BoolSettingValue value = bools_table.Get(key);
     switch (value) {
     case UNSET:
@@ -222,26 +221,22 @@
     return true;
   }
 
-  virtual bool GetInt(IntSetting key, int* result) override {
+  bool GetInt(IntSetting key, int* result) override {
     // We don't bother to distinguish unset keys from 0 values.
     *result = ints_table.Get(key);
     return true;
   }
 
-  virtual bool GetStringList(StringListSetting key,
-                             std::vector<std::string>* result) override {
+  bool GetStringList(StringListSetting key,
+                     std::vector<std::string>* result) override {
     *result = string_lists_table.Get(key);
     // We don't bother to distinguish unset keys from empty lists.
     return !result->empty();
   }
 
-  virtual bool BypassListIsReversed() override {
-    return false;
-  }
+  bool BypassListIsReversed() override { return false; }
 
-  virtual bool MatchHostsUsingSuffixMatching() override {
-    return false;
-  }
+  bool MatchHostsUsingSuffixMatching() override { return false; }
 
   // Intentionally public, for convenience when setting up a test.
   GConfValues values;
@@ -355,7 +350,7 @@
 // must use the same test fixture class (also "ProxyConfigServiceLinuxTest").
 class ProxyConfigServiceLinuxTest : public PlatformTest {
  protected:
-  virtual void SetUp() override {
+  void SetUp() override {
     PlatformTest::SetUp();
     // Set up a temporary KDE home directory.
     std::string prefix("ProxyConfigServiceLinuxTest_user_home");
@@ -372,7 +367,7 @@
     kioslaverc4_ = kde4_config_.Append(FILE_PATH_LITERAL("kioslaverc"));
   }
 
-  virtual void TearDown() override {
+  void TearDown() override {
     // Delete the temporary KDE home directory.
     base::DeleteFile(user_home_, true);
     PlatformTest::TearDown();
diff --git a/net/proxy/proxy_config_service_win.cc b/net/proxy/proxy_config_service_win.cc
index dba1d9b..6547659 100644
--- a/net/proxy/proxy_config_service_win.cc
+++ b/net/proxy/proxy_config_service_win.cc
@@ -11,7 +11,7 @@
 #include "base/bind_helpers.h"
 #include "base/logging.h"
 #include "base/memory/scoped_ptr.h"
-#include "base/profiler/scoped_profile.h"
+#include "base/profiler/scoped_tracker.h"
 #include "base/stl_util.h"
 #include "base/strings/string_util.h"
 #include "base/strings/string_tokenizer.h"
@@ -113,8 +113,8 @@
 }
 
 void ProxyConfigServiceWin::OnObjectSignaled(base::win::RegKey* key) {
-  // TODO(vadimt): Remove ScopedProfile below once crbug.com/418183 is fixed.
-  tracked_objects::ScopedProfile tracking_profile(
+  // TODO(vadimt): Remove ScopedTracker below once crbug.com/418183 is fixed.
+  tracked_objects::ScopedTracker tracking_profile(
       FROM_HERE_WITH_EXPLICIT_FUNCTION(
           "ProxyConfigServiceWin_OnObjectSignaled"));
 
diff --git a/net/proxy/proxy_resolver_v8.cc b/net/proxy/proxy_resolver_v8.cc
index d7916e0..24fbe9e 100644
--- a/net/proxy/proxy_resolver_v8.cc
+++ b/net/proxy/proxy_resolver_v8.cc
@@ -133,7 +133,7 @@
 const size_t kMaxStringBytesForCopy = 256;
 
 // Converts a V8 String to a UTF8 std::string.
-std::string V8StringToUTF8(v8::Handle<v8::String> s) {
+std::string V8StringToUTF8(v8::Local<v8::String> s) {
   int len = s->Length();
   std::string result;
   if (len > 0)
@@ -142,7 +142,7 @@
 }
 
 // Converts a V8 String to a UTF16 base::string16.
-base::string16 V8StringToUTF16(v8::Handle<v8::String> s) {
+base::string16 V8StringToUTF16(v8::Local<v8::String> s) {
   int len = s->Length();
   base::string16 result;
   // Note that the reinterpret cast is because on Windows string16 is an alias
@@ -189,7 +189,7 @@
 
 // Stringizes a V8 object by calling its toString() method. Returns true
 // on success. This may fail if the toString() throws an exception.
-bool V8ObjectToUTF16String(v8::Handle<v8::Value> object,
+bool V8ObjectToUTF16String(v8::Local<v8::Value> object,
                            base::string16* utf16_result,
                            v8::Isolate* isolate) {
   if (object.IsEmpty())
@@ -373,7 +373,7 @@
       return ERR_PAC_SCRIPT_FAILED;
     }
 
-    v8::Handle<v8::Value> argv[] = {
+    v8::Local<v8::Value> argv[] = {
       ASCIIStringToV8String(isolate_, query_url.spec()),
       ASCIIStringToV8String(isolate_, query_url.HostNoBrackets()),
     };
@@ -512,7 +512,7 @@
   }
 
   // Handle an exception thrown by V8.
-  void HandleError(v8::Handle<v8::Message> message) {
+  void HandleError(v8::Local<v8::Message> message) {
     base::string16 error_message;
     int line_number = -1;
 
@@ -526,7 +526,7 @@
 
   // Compiles and runs |script| in the current V8 context.
   // Returns OK on success, otherwise an error code.
-  int RunScript(v8::Handle<v8::String> script, const char* script_name) {
+  int RunScript(v8::Local<v8::String> script, const char* script_name) {
     v8::TryCatch try_catch;
 
     // Compile the script.
diff --git a/net/proxy/proxy_resolver_v8_tracing_unittest.cc b/net/proxy/proxy_resolver_v8_tracing_unittest.cc
index 0c16a1a..31188ca 100644
--- a/net/proxy/proxy_resolver_v8_tracing_unittest.cc
+++ b/net/proxy/proxy_resolver_v8_tracing_unittest.cc
@@ -31,7 +31,7 @@
 
 class ProxyResolverV8TracingTest : public testing::Test {
  public:
-  virtual void TearDown() override {
+  void TearDown() override {
     // Drain any pending messages, which may be left over from cancellation.
     // This way they get reliably run as part of the current test, rather than
     // spilling into the next test's execution.
diff --git a/net/proxy/proxy_script_decider_unittest.cc b/net/proxy/proxy_script_decider_unittest.cc
index ee2958c..8914f5b 100644
--- a/net/proxy/proxy_script_decider_unittest.cc
+++ b/net/proxy/proxy_script_decider_unittest.cc
@@ -310,7 +310,7 @@
       : rule_(rules_.AddSuccessRule("http://wpad/wpad.dat")),
         fetcher_(&rules_) { }
 
-  virtual void SetUp() override {
+  void SetUp() override {
     request_context_.set_host_resolver(&resolver_);
     fetcher_.SetRequestContext(&request_context_);
     config_.set_auto_detect(true);
diff --git a/net/proxy/proxy_service_unittest.cc b/net/proxy/proxy_service_unittest.cc
index aab3de3..cfaaccf 100644
--- a/net/proxy/proxy_service_unittest.cc
+++ b/net/proxy/proxy_service_unittest.cc
@@ -98,13 +98,13 @@
 // are careful to avoid timing problems.
 class ProxyServiceTest : public testing::Test {
  protected:
-  virtual void SetUp() override {
+  void SetUp() override {
     testing::Test::SetUp();
     previous_policy_ =
         ProxyService::set_pac_script_poll_policy(&never_poll_policy_);
   }
 
-  virtual void TearDown() override {
+  void TearDown() override {
     // Restore the original policy.
     ProxyService::set_pac_script_poll_policy(previous_policy_);
     testing::Test::TearDown();
diff --git a/net/quic/congestion_control/hybrid_slow_start_test.cc b/net/quic/congestion_control/hybrid_slow_start_test.cc
index bea5840..dd74933 100644
--- a/net/quic/congestion_control/hybrid_slow_start_test.cc
+++ b/net/quic/congestion_control/hybrid_slow_start_test.cc
@@ -17,9 +17,7 @@
      : one_ms_(QuicTime::Delta::FromMilliseconds(1)),
        rtt_(QuicTime::Delta::FromMilliseconds(60)) {
   }
-  virtual void SetUp() {
-    slow_start_.reset(new HybridSlowStart(&clock_));
-  }
+  void SetUp() override { slow_start_.reset(new HybridSlowStart(&clock_)); }
   const QuicTime::Delta one_ms_;
   const QuicTime::Delta rtt_;
   MockClock clock_;
diff --git a/net/quic/congestion_control/leaky_bucket_test.cc b/net/quic/congestion_control/leaky_bucket_test.cc
index 977ef94..8387ada 100644
--- a/net/quic/congestion_control/leaky_bucket_test.cc
+++ b/net/quic/congestion_control/leaky_bucket_test.cc
@@ -13,7 +13,7 @@
 
 class LeakyBucketTest : public ::testing::Test {
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     leaky_bucket_.reset(new LeakyBucket(QuicBandwidth::Zero()));
   }
   MockClock clock_;
diff --git a/net/quic/congestion_control/pacing_sender_test.cc b/net/quic/congestion_control/pacing_sender_test.cc
index 0be0b0a..a7838b9 100644
--- a/net/quic/congestion_control/pacing_sender_test.cc
+++ b/net/quic/congestion_control/pacing_sender_test.cc
@@ -35,7 +35,7 @@
     clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(9));
   }
 
-  virtual ~PacingSenderTest() {}
+  ~PacingSenderTest() override {}
 
   void CheckPacketIsSentImmediately() {
     // In order for the packet to be sendable, the underlying sender must
diff --git a/net/quic/congestion_control/tcp_receiver_test.cc b/net/quic/congestion_control/tcp_receiver_test.cc
index e074fdf..833631e 100644
--- a/net/quic/congestion_control/tcp_receiver_test.cc
+++ b/net/quic/congestion_control/tcp_receiver_test.cc
@@ -13,9 +13,7 @@
 
 class QuicTcpReceiverTest : public ::testing::Test {
  protected:
-  virtual void SetUp() {
-    receiver_.reset(new TcpReceiver());
-  }
+  void SetUp() override { receiver_.reset(new TcpReceiver()); }
   scoped_ptr<TcpReceiver> receiver_;
 };
 
diff --git a/net/quic/crypto/aes_128_gcm_12_decrypter.h b/net/quic/crypto/aes_128_gcm_12_decrypter.h
index 3de537e..0f7f1d1 100644
--- a/net/quic/crypto/aes_128_gcm_12_decrypter.h
+++ b/net/quic/crypto/aes_128_gcm_12_decrypter.h
@@ -28,10 +28,10 @@
 #if !defined(USE_OPENSSL)
  protected:
   // AeadBaseDecrypter methods:
-  virtual void FillAeadParams(base::StringPiece nonce,
-                              base::StringPiece associated_data,
-                              size_t auth_tag_size,
-                              AeadParams* aead_params) const override;
+  void FillAeadParams(base::StringPiece nonce,
+                      base::StringPiece associated_data,
+                      size_t auth_tag_size,
+                      AeadParams* aead_params) const override;
 #endif
 
  private:
diff --git a/net/quic/crypto/aes_128_gcm_12_encrypter.h b/net/quic/crypto/aes_128_gcm_12_encrypter.h
index bff3ec5..2b432fb 100644
--- a/net/quic/crypto/aes_128_gcm_12_encrypter.h
+++ b/net/quic/crypto/aes_128_gcm_12_encrypter.h
@@ -28,10 +28,10 @@
 #if !defined(USE_OPENSSL)
  protected:
   // AeadBaseEncrypter methods:
-  virtual void FillAeadParams(base::StringPiece nonce,
-                              base::StringPiece associated_data,
-                              size_t auth_tag_size,
-                              AeadParams* aead_params) const override;
+  void FillAeadParams(base::StringPiece nonce,
+                      base::StringPiece associated_data,
+                      size_t auth_tag_size,
+                      AeadParams* aead_params) const override;
 #endif
 
  private:
diff --git a/net/quic/crypto/chacha20_poly1305_decrypter.h b/net/quic/crypto/chacha20_poly1305_decrypter.h
index 04f5341..7d81d70 100644
--- a/net/quic/crypto/chacha20_poly1305_decrypter.h
+++ b/net/quic/crypto/chacha20_poly1305_decrypter.h
@@ -32,10 +32,10 @@
 #if !defined(USE_OPENSSL)
  protected:
   // AeadBaseDecrypter methods:
-  virtual void FillAeadParams(base::StringPiece nonce,
-                              base::StringPiece associated_data,
-                              size_t auth_tag_size,
-                              AeadParams* aead_params) const override;
+  void FillAeadParams(base::StringPiece nonce,
+                      base::StringPiece associated_data,
+                      size_t auth_tag_size,
+                      AeadParams* aead_params) const override;
 #endif
 
  private:
diff --git a/net/quic/crypto/chacha20_poly1305_encrypter.h b/net/quic/crypto/chacha20_poly1305_encrypter.h
index 1dcfd7c..6504970 100644
--- a/net/quic/crypto/chacha20_poly1305_encrypter.h
+++ b/net/quic/crypto/chacha20_poly1305_encrypter.h
@@ -32,10 +32,10 @@
 #if !defined(USE_OPENSSL)
  protected:
   // AeadBaseEncrypter methods:
-  virtual void FillAeadParams(base::StringPiece nonce,
-                              base::StringPiece associated_data,
-                              size_t auth_tag_size,
-                              AeadParams* aead_params) const override;
+  void FillAeadParams(base::StringPiece nonce,
+                      base::StringPiece associated_data,
+                      size_t auth_tag_size,
+                      AeadParams* aead_params) const override;
 #endif
 
  private:
diff --git a/net/quic/crypto/crypto_server_test.cc b/net/quic/crypto/crypto_server_test.cc
index 1905109..74a3666 100644
--- a/net/quic/crypto/crypto_server_test.cc
+++ b/net/quic/crypto/crypto_server_test.cc
@@ -92,7 +92,7 @@
         GetParam().send_quic_crypto_reject_reason;
   }
 
-  virtual void SetUp() {
+  void SetUp() override {
     scoped_ptr<CryptoHandshakeMessage> msg(
         config_.AddDefaultConfig(rand_, &clock_,
         config_options_));
@@ -640,7 +640,7 @@
 
 class CryptoServerTestNoConfig : public CryptoServerTest {
  public:
-  virtual void SetUp() {
+  void SetUp() override {
     // Deliberately don't add a config so that we can test this situation.
   }
 };
@@ -662,7 +662,7 @@
   AsyncStrikeServerVerificationTest() {
   }
 
-  virtual void SetUp() {
+  void SetUp() override {
     const string kOrbit = "12345678";
     config_options_.orbit = kOrbit;
     strike_register_client_ = new DelayedVerifyStrikeRegisterClient(
diff --git a/net/quic/crypto/local_strike_register_client_test.cc b/net/quic/crypto/local_strike_register_client_test.cc
index a2c3ce2..b713c10 100644
--- a/net/quic/crypto/local_strike_register_client_test.cc
+++ b/net/quic/crypto/local_strike_register_client_test.cc
@@ -60,7 +60,7 @@
   LocalStrikeRegisterClientTest() {
   }
 
-  virtual void SetUp() {
+  void SetUp() override {
     strike_register_.reset(new LocalStrikeRegisterClient(
         kMaxEntries, kCurrentTimeExternalSecs, kWindowSecs, kOrbit,
         net::StrikeRegister::NO_STARTUP_PERIOD_NEEDED));
diff --git a/net/quic/crypto/proof_verifier_chromium.cc b/net/quic/crypto/proof_verifier_chromium.cc
index 775e374..f9568c2 100644
--- a/net/quic/crypto/proof_verifier_chromium.cc
+++ b/net/quic/crypto/proof_verifier_chromium.cc
@@ -250,6 +250,19 @@
     result = ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN;
   }
 
+  scoped_refptr<ct::EVCertsWhitelist> ev_whitelist =
+      SSLConfigService::GetEVCertsWhitelist();
+  if ((cert_status & CERT_STATUS_IS_EV) && ev_whitelist.get() &&
+      ev_whitelist->IsValid()) {
+    const SHA256HashValue fingerprint(
+        X509Certificate::CalculateFingerprint256(cert_->os_cert_handle()));
+
+    UMA_HISTOGRAM_BOOLEAN(
+        "Net.SSL_EVCertificateInWhitelist",
+        ev_whitelist->ContainsCertificateHash(
+            std::string(reinterpret_cast<const char*>(fingerprint.data), 8)));
+  }
+
   if (result != OK) {
     std::string error_string = ErrorToString(result);
     error_details_ = StringPrintf("Failed to verify certificate chain: %s",
diff --git a/net/quic/crypto/quic_crypto_server_config_test.cc b/net/quic/crypto/quic_crypto_server_config_test.cc
index 0743a18..1e91dfc 100644
--- a/net/quic/crypto/quic_crypto_server_config_test.cc
+++ b/net/quic/crypto/quic_crypto_server_config_test.cc
@@ -402,7 +402,7 @@
         config_(QuicCryptoServerConfig::TESTING, rand_),
         test_peer_(&config_) {}
 
-  virtual void SetUp() {
+  void SetUp() override {
     clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1000));
   }
 
diff --git a/net/quic/crypto/quic_server_info.h b/net/quic/crypto/quic_server_info.h
index fd54b94..2a5c6fc 100644
--- a/net/quic/crypto/quic_server_info.h
+++ b/net/quic/crypto/quic_server_info.h
@@ -45,6 +45,10 @@
   // but, obviously, a callback will never be made.
   virtual int WaitForDataReady(const CompletionCallback& callback) = 0;
 
+  // Cancel's WaitForDataReady callback. |callback| passed in WaitForDataReady
+  // will not be called.
+  virtual void CancelWaitForDataReadyCallback() = 0;
+
   // Returns true if data is loaded from disk cache and ready (WaitForDataReady
   // doesn't have a pending callback).
   virtual bool IsDataReady() = 0;
@@ -104,13 +108,16 @@
   DISALLOW_COPY_AND_ASSIGN(QuicServerInfo);
 };
 
-class QuicServerInfoFactory {
+class NET_EXPORT_PRIVATE QuicServerInfoFactory {
  public:
+  QuicServerInfoFactory() {}
   virtual ~QuicServerInfoFactory();
 
   // GetForServer returns a fresh, allocated QuicServerInfo for the given
   // |server_id| or NULL on failure.
   virtual QuicServerInfo* GetForServer(const QuicServerId& server_id) = 0;
+
+  DISALLOW_COPY_AND_ASSIGN(QuicServerInfoFactory);
 };
 
 }  // namespace net
diff --git a/net/quic/quic_ack_notifier_test.cc b/net/quic/quic_ack_notifier_test.cc
index 63bc254..fbc7e37 100644
--- a/net/quic/quic_ack_notifier_test.cc
+++ b/net/quic/quic_ack_notifier_test.cc
@@ -18,7 +18,7 @@
  protected:
   QuicAckNotifierTest() : zero_(QuicTime::Delta::Zero()) {}
 
-  virtual void SetUp() {
+  void SetUp() override {
     delegate_ = new MockAckNotifierDelegate;
     notifier_.reset(new QuicAckNotifier(delegate_));
 
diff --git a/net/quic/quic_client_session_test.cc b/net/quic/quic_client_session_test.cc
index b1cfe3d..cae2220 100644
--- a/net/quic/quic_client_session_test.cc
+++ b/net/quic/quic_client_session_test.cc
@@ -53,9 +53,7 @@
                                 &crypto_config_, nullptr);
   }
 
-  virtual void TearDown() override {
-    session_.CloseSessionOnError(ERR_ABORTED);
-  }
+  void TearDown() override { session_.CloseSessionOnError(ERR_ABORTED); }
 
   scoped_ptr<DatagramClientSocket> GetSocket() {
     socket_factory_.AddSocketDataProvider(&socket_data_);
diff --git a/net/quic/quic_end_to_end_unittest.cc b/net/quic/quic_end_to_end_unittest.cc
index 96833af..a3fa12b 100644
--- a/net/quic/quic_end_to_end_unittest.cc
+++ b/net/quic/quic_end_to_end_unittest.cc
@@ -49,21 +49,18 @@
   TestTransactionFactory(const HttpNetworkSession::Params& params)
       : session_(new HttpNetworkSession(params)) {}
 
-  virtual ~TestTransactionFactory() {
-  }
+  ~TestTransactionFactory() override {}
 
   // HttpTransactionFactory methods
-  virtual int CreateTransaction(RequestPriority priority,
-                                scoped_ptr<HttpTransaction>* trans) override {
+  int CreateTransaction(RequestPriority priority,
+                        scoped_ptr<HttpTransaction>* trans) override {
     trans->reset(new HttpNetworkTransaction(priority, session_.get()));
     return OK;
   }
 
-  virtual HttpCache* GetCache() override {
-    return nullptr;
-  }
+  HttpCache* GetCache() override { return nullptr; }
 
-  virtual HttpNetworkSession* GetSession() override { return session_.get(); };
+  HttpNetworkSession* GetSession() override { return session_.get(); };
 
  private:
   scoped_refptr<HttpNetworkSession> session_;
@@ -105,7 +102,7 @@
     return resolver;
   }
 
-  virtual void SetUp() {
+  void SetUp() override {
     QuicInMemoryCachePeer::ResetForTests();
     StartServer();
 
@@ -123,7 +120,7 @@
     transaction_factory_.reset(new TestTransactionFactory(params_));
   }
 
-  virtual void TearDown() {
+  void TearDown() override {
     StopServer();
     QuicInMemoryCachePeer::ResetForTests();
   }
diff --git a/net/quic/quic_network_transaction_unittest.cc b/net/quic/quic_network_transaction_unittest.cc
index 9d12a01..ab698f3 100644
--- a/net/quic/quic_network_transaction_unittest.cc
+++ b/net/quic/quic_network_transaction_unittest.cc
@@ -121,12 +121,12 @@
     clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20));
   }
 
-  virtual void SetUp() {
+  void SetUp() override {
     NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
     base::MessageLoop::current()->RunUntilIdle();
   }
 
-  virtual void TearDown() {
+  void TearDown() override {
     NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
     // Empty the current queue.
     base::MessageLoop::current()->RunUntilIdle();
diff --git a/net/quic/quic_stream_factory.cc b/net/quic/quic_stream_factory.cc
index 046c0a1..678463e 100644
--- a/net/quic/quic_stream_factory.cc
+++ b/net/quic/quic_stream_factory.cc
@@ -180,6 +180,8 @@
 
   void OnIOComplete(int rv);
 
+  void CancelWaitForDataReadyCallback();
+
   CompletionCallback callback() {
     return callback_;
   }
@@ -309,6 +311,14 @@
   }
 }
 
+void QuicStreamFactory::Job::CancelWaitForDataReadyCallback() {
+  // If we are waiting for WaitForDataReadyCallback, then cancel the callback.
+  if (io_state_ != STATE_LOAD_SERVER_INFO_COMPLETE)
+    return;
+  server_info_->CancelWaitForDataReadyCallback();
+  OnIOComplete(OK);
+}
+
 int QuicStreamFactory::Job::DoResolveHost() {
   // Start loading the data now, and wait for it after we resolve the host.
   if (server_info_) {
@@ -350,6 +360,17 @@
   if (!server_info_)
     return OK;
 
+  // To mitigate the effects of disk cache taking too long to load QUIC server
+  // information, set up a timer to cancel WaitForDataReady's callback.
+  if (factory_->load_server_info_timeout_ms_ > 0) {
+    factory_->task_runner_->PostDelayedTask(
+        FROM_HERE,
+        base::Bind(&QuicStreamFactory::Job::CancelWaitForDataReadyCallback,
+                   weak_factory_.GetWeakPtr()),
+        base::TimeDelta::FromMilliseconds(
+            factory_->load_server_info_timeout_ms_));
+  }
+
   disk_cache_load_start_time_ = base::TimeTicks::Now();
   return server_info_->WaitForDataReady(
       base::Bind(&QuicStreamFactory::Job::OnIOComplete,
@@ -491,6 +512,7 @@
     bool enable_port_selection,
     bool always_require_handshake_confirmation,
     bool disable_connection_pooling,
+    int load_server_info_timeout,
     const QuicTagVector& connection_options)
     : require_confirmation_(true),
       host_resolver_(host_resolver),
@@ -508,8 +530,10 @@
       always_require_handshake_confirmation_(
           always_require_handshake_confirmation),
       disable_connection_pooling_(disable_connection_pooling),
+      load_server_info_timeout_ms_(load_server_info_timeout),
       port_seed_(random_generator_->RandUint64()),
       check_persisted_supports_quic_(true),
+      task_runner_(nullptr),
       weak_factory_(this) {
   DCHECK(transport_security_state_);
   crypto_config_.set_user_agent_id(user_agent_id);
@@ -574,6 +598,11 @@
       quic_server_info = quic_server_info_factory_->GetForServer(server_id);
     }
   }
+  // TODO(rtenneti): Initialize task_runner_ in the constructor after
+  // WebRequestActionWithThreadsTest.* tests are fixed.
+  if (!task_runner_)
+    task_runner_ = base::MessageLoop::current()->message_loop_proxy().get();
+
   bool was_alternate_protocol_recently_broken =
       http_server_properties_ &&
       http_server_properties_->WasAlternateProtocolRecentlyBroken(
diff --git a/net/quic/quic_stream_factory.h b/net/quic/quic_stream_factory.h
index 7ee3681..c892cb2 100644
--- a/net/quic/quic_stream_factory.h
+++ b/net/quic/quic_stream_factory.h
@@ -104,6 +104,7 @@
       bool enable_port_selection,
       bool always_require_handshake_confirmation,
       bool disable_connection_pooling,
+      int load_server_info_timeout,
       const QuicTagVector& connection_options);
   ~QuicStreamFactory() override;
 
@@ -282,6 +283,11 @@
   // Set if we do not want connection pooling.
   bool disable_connection_pooling_;
 
+  // Specifies the timeout in milliseconds to wait for loading of QUIC server
+  // information. If we don't want to timeout, set
+  // |load_server_info_timeout_ms_| to 0.
+  int load_server_info_timeout_ms_;
+
   // Each profile will (probably) have a unique port_seed_ value.  This value is
   // used to help seed a pseudo-random number generator (PortSuggester) so that
   // we consistently (within this profile) suggest the same ephemeral port when
@@ -294,6 +300,8 @@
   IPEndPoint local_address_;
   bool check_persisted_supports_quic_;
 
+  base::TaskRunner* task_runner_;
+
   base::WeakPtrFactory<QuicStreamFactory> weak_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(QuicStreamFactory);
diff --git a/net/quic/quic_stream_factory_test.cc b/net/quic/quic_stream_factory_test.cc
index ece3e64..4818620 100644
--- a/net/quic/quic_stream_factory_test.cc
+++ b/net/quic/quic_stream_factory_test.cc
@@ -17,6 +17,7 @@
 #include "net/quic/crypto/proof_verifier_chromium.h"
 #include "net/quic/crypto/quic_decrypter.h"
 #include "net/quic/crypto/quic_encrypter.h"
+#include "net/quic/crypto/quic_server_info.h"
 #include "net/quic/quic_http_stream.h"
 #include "net/quic/quic_server_id.h"
 #include "net/quic/test_tools/mock_clock.h"
@@ -24,6 +25,7 @@
 #include "net/quic/test_tools/mock_random.h"
 #include "net/quic/test_tools/quic_test_packet_maker.h"
 #include "net/quic/test_tools/quic_test_utils.h"
+#include "net/quic/test_tools/test_task_runner.h"
 #include "net/socket/socket_test_util.h"
 #include "net/spdy/spdy_test_utils.h"
 #include "net/ssl/channel_id_service.h"
@@ -88,13 +90,56 @@
   static void DisableConnectionPooling(QuicStreamFactory* factory) {
     factory->disable_connection_pooling_ = true;
   }
+
+  static void SetTaskRunner(QuicStreamFactory* factory,
+                            base::TaskRunner* task_runner) {
+    factory->task_runner_ = task_runner;
+  }
+
+  static void SetLoadServerInfoTimeout(QuicStreamFactory* factory,
+                                       size_t load_server_info_timeout) {
+    factory->load_server_info_timeout_ms_ = load_server_info_timeout;
+  }
 };
 
+class MockQuicServerInfo : public QuicServerInfo {
+ public:
+  MockQuicServerInfo(const QuicServerId& server_id)
+      : QuicServerInfo(server_id) {}
+  virtual ~MockQuicServerInfo() {}
+
+  virtual void Start() override {};
+
+  virtual int WaitForDataReady(const CompletionCallback& callback) override {
+    return ERR_IO_PENDING;
+  }
+
+  virtual void CancelWaitForDataReadyCallback() override {}
+
+  virtual bool IsDataReady() override { return false; }
+
+  virtual bool IsReadyToPersist() override { return false; }
+
+  virtual void Persist() override {};
+};
+
+class MockQuicServerInfoFactory : public QuicServerInfoFactory {
+ public:
+  MockQuicServerInfoFactory() {}
+  virtual ~MockQuicServerInfoFactory() {}
+
+  virtual QuicServerInfo* GetForServer(const QuicServerId& server_id) override {
+    return new MockQuicServerInfo(server_id);
+  }
+};
+
+
 class QuicStreamFactoryTest : public ::testing::TestWithParam<QuicVersion> {
  protected:
   QuicStreamFactoryTest()
       : random_generator_(0),
         clock_(new MockClock()),
+        runner_(new TestTaskRunner(clock_)),
         maker_(GetParam(), 0, clock_),
         cert_verifier_(CertVerifier::CreateDefault()),
         channel_id_service_(
@@ -115,6 +160,7 @@
                  /*enable_port_selection=*/true,
                  /*always_require_handshake_confirmation=*/false,
                  /*disable_connection_pooling=*/false,
+                 /*load_server_info_timeout=*/0u,
                  QuicTagVector()),
         host_port_pair_(kDefaultServerHostName, kDefaultServerPort),
         is_https_(false),
@@ -197,11 +243,13 @@
         AdjustErrorForVersion(QUIC_RST_FLOW_CONTROL_ACCOUNTING, GetParam()));
   }
 
+  MockQuicServerInfoFactory quic_server_info_factory_;
   MockHostResolver host_resolver_;
   DeterministicMockClientSocketFactory socket_factory_;
   MockCryptoClientStreamFactory crypto_client_stream_factory_;
   MockRandom random_generator_;
   MockClock* clock_;  // Owned by factory_.
+  scoped_refptr<TestTaskRunner> runner_;
   QuicTestPacketMaker maker_;
   scoped_ptr<CertVerifier> cert_verifier_;
   scoped_ptr<ChannelIDService> channel_id_service_;
@@ -1509,5 +1557,48 @@
   }
 }
 
+TEST_P(QuicStreamFactoryTest, CancelWaitForDataReady) {
+  factory_.set_quic_server_info_factory(&quic_server_info_factory_);
+  QuicStreamFactoryPeer::SetTaskRunner(&factory_, runner_.get());
+  const size_t kLoadServerInfoTimeoutMs = 50;
+  QuicStreamFactoryPeer::SetLoadServerInfoTimeout(
+      &factory_, kLoadServerInfoTimeoutMs);
+
+  MockRead reads[] = {
+    MockRead(ASYNC, OK, 0)  // EOF
+  };
+  DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
+  socket_factory_.AddSocketDataProvider(&socket_data);
+  socket_data.StopAfter(1);
+
+  crypto_client_stream_factory_.set_handshake_mode(
+      MockCryptoClientStream::ZERO_RTT);
+  host_resolver_.set_synchronous_mode(true);
+  host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
+                                           "192.168.0.1", "");
+
+  QuicStreamRequest request(&factory_);
+  EXPECT_EQ(ERR_IO_PENDING,
+            request.Request(host_port_pair_,
+                            is_https_,
+                            privacy_mode_,
+                            "GET",
+                            net_log_,
+                            callback_.callback()));
+
+  // Verify that the CancelWaitForDataReady task has been posted.
+  ASSERT_EQ(1u, runner_->GetPostedTasks().size());
+  EXPECT_EQ(base::TimeDelta::FromMilliseconds(kLoadServerInfoTimeoutMs),
+            runner_->GetPostedTasks()[0].delay);
+
+  runner_->RunNextTask();
+  ASSERT_EQ(0u, runner_->GetPostedTasks().size());
+
+  scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
+  EXPECT_TRUE(stream.get());
+  EXPECT_TRUE(socket_data.at_read_eof());
+  EXPECT_TRUE(socket_data.at_write_eof());
+}
+
 }  // namespace test
 }  // namespace net
diff --git a/net/quic/test_tools/crypto_test_utils_nss.cc b/net/quic/test_tools/crypto_test_utils_nss.cc
index 96fdd31..f427750 100644
--- a/net/quic/test_tools/crypto_test_utils_nss.cc
+++ b/net/quic/test_tools/crypto_test_utils_nss.cc
@@ -20,13 +20,11 @@
 
 class TestChannelIDSource : public ChannelIDSource {
  public:
-  virtual ~TestChannelIDSource() {
-    STLDeleteValues(&hostname_to_key_);
-  }
+  ~TestChannelIDSource() override { STLDeleteValues(&hostname_to_key_); }
 
   // ChannelIDSource implementation.
 
-  virtual QuicAsyncStatus GetChannelIDKey(
+  QuicAsyncStatus GetChannelIDKey(
       const string& hostname,
       scoped_ptr<ChannelIDKey>* channel_id_key,
       ChannelIDSourceCallback* /*callback*/) override {
diff --git a/net/server/http_server_unittest.cc b/net/server/http_server_unittest.cc
index 5da2c0f..c25c03e 100644
--- a/net/server/http_server_unittest.cc
+++ b/net/server/http_server_unittest.cc
@@ -181,7 +181,7 @@
  public:
   HttpServerTest() : quit_after_request_count_(0) {}
 
-  virtual void SetUp() override {
+  void SetUp() override {
     scoped_ptr<ServerSocket> server_socket(
         new TCPServerSocket(NULL, net::NetLog::Source()));
     server_socket->ListenWithAddressAndPort("127.0.0.1", 0, 1);
diff --git a/net/socket/client_socket_pool_base_unittest.cc b/net/socket/client_socket_pool_base_unittest.cc
index e2666fb..c4a2845 100644
--- a/net/socket/client_socket_pool_base_unittest.cc
+++ b/net/socket/client_socket_pool_base_unittest.cc
@@ -667,7 +667,7 @@
         internal::ClientSocketPoolBaseHelper::cleanup_timer_enabled();
   }
 
-  virtual ~ClientSocketPoolBaseTest() {
+  ~ClientSocketPoolBaseTest() override {
     internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(
         connect_backup_jobs_enabled_);
     internal::ClientSocketPoolBaseHelper::set_cleanup_timer_enabled(
diff --git a/net/socket/deterministic_socket_data_unittest.cc b/net/socket/deterministic_socket_data_unittest.cc
index 9a2d833..bdeba2b 100644
--- a/net/socket/deterministic_socket_data_unittest.cc
+++ b/net/socket/deterministic_socket_data_unittest.cc
@@ -29,7 +29,7 @@
  public:
   DeterministicSocketDataTest();
 
-  virtual void TearDown();
+  void TearDown() override;
 
   void ReentrantReadCallback(int len, int rv);
   void ReentrantWriteCallback(const char* data, int len, int rv);
diff --git a/net/socket/socks5_client_socket_unittest.cc b/net/socket/socks5_client_socket_unittest.cc
index 78f2ac4..c474a0b 100644
--- a/net/socket/socks5_client_socket_unittest.cc
+++ b/net/socket/socks5_client_socket_unittest.cc
@@ -40,7 +40,7 @@
                                                  int port,
                                                  NetLog* net_log);
 
-  virtual void SetUp();
+  void SetUp() override;
 
  protected:
   const uint16 kNwPort;
diff --git a/net/socket/socks_client_socket_pool_unittest.cc b/net/socket/socks_client_socket_pool_unittest.cc
index ec2230c..391d31b 100644
--- a/net/socket/socks_client_socket_pool_unittest.cc
+++ b/net/socket/socks_client_socket_pool_unittest.cc
@@ -103,7 +103,7 @@
               NULL) {
   }
 
-  virtual ~SOCKSClientSocketPoolTest() {}
+  ~SOCKSClientSocketPoolTest() override {}
 
   int StartRequestV5(const std::string& group_name, RequestPriority priority) {
     return test_base_.StartRequestUsingPool(
diff --git a/net/socket/socks_client_socket_unittest.cc b/net/socket/socks_client_socket_unittest.cc
index ced7d9e..fbb84f8 100644
--- a/net/socket/socks_client_socket_unittest.cc
+++ b/net/socket/socks_client_socket_unittest.cc
@@ -35,7 +35,7 @@
       HostResolver* host_resolver,
       const std::string& hostname, int port,
       NetLog* net_log);
-  virtual void SetUp();
+  void SetUp() override;
 
  protected:
   scoped_ptr<SOCKSClientSocket> user_sock_;
diff --git a/net/socket/ssl_client_socket_nss.cc b/net/socket/ssl_client_socket_nss.cc
index e20b28a..d336350 100644
--- a/net/socket/ssl_client_socket_nss.cc
+++ b/net/socket/ssl_client_socket_nss.cc
@@ -94,7 +94,7 @@
 #include "net/cert/asn1_util.h"
 #include "net/cert/cert_status_flags.h"
 #include "net/cert/cert_verifier.h"
-#include "net/cert/ct_objects_extractor.h"
+#include "net/cert/ct_ev_whitelist.h"
 #include "net/cert/ct_verifier.h"
 #include "net/cert/ct_verify_result.h"
 #include "net/cert/scoped_nss_types.h"
@@ -3507,6 +3507,21 @@
     result = ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN;
   }
 
+  scoped_refptr<ct::EVCertsWhitelist> ev_whitelist =
+      SSLConfigService::GetEVCertsWhitelist();
+  if (server_cert_verify_result_.cert_status & CERT_STATUS_IS_EV) {
+    if (ev_whitelist.get() && ev_whitelist->IsValid()) {
+      const SHA256HashValue fingerprint(
+          X509Certificate::CalculateFingerprint256(
+              server_cert_verify_result_.verified_cert->os_cert_handle()));
+
+      UMA_HISTOGRAM_BOOLEAN(
+          "Net.SSL_EVCertificateInWhitelist",
+          ev_whitelist->ContainsCertificateHash(
+              std::string(reinterpret_cast<const char*>(fingerprint.data), 8)));
+    }
+  }
+
   if (result == OK) {
     // Only check Certificate Transparency if there were no other errors with
     // the connection.
diff --git a/net/socket/ssl_client_socket_nss.h b/net/socket/ssl_client_socket_nss.h
index ccdbb81..0693ee8 100644
--- a/net/socket/ssl_client_socket_nss.h
+++ b/net/socket/ssl_client_socket_nss.h
@@ -65,53 +65,51 @@
                      const HostPortPair& host_and_port,
                      const SSLConfig& ssl_config,
                      const SSLClientSocketContext& context);
-  virtual ~SSLClientSocketNSS();
+  ~SSLClientSocketNSS() override;
 
   // SSLClientSocket implementation.
-  virtual std::string GetSessionCacheKey() const override;
-  virtual bool InSessionCache() const override;
-  virtual void SetHandshakeCompletionCallback(
-      const base::Closure& callback) override;
-  virtual void GetSSLCertRequestInfo(
-      SSLCertRequestInfo* cert_request_info) override;
-  virtual NextProtoStatus GetNextProto(std::string* proto) override;
+  std::string GetSessionCacheKey() const override;
+  bool InSessionCache() const override;
+  void SetHandshakeCompletionCallback(const base::Closure& callback) override;
+  void GetSSLCertRequestInfo(SSLCertRequestInfo* cert_request_info) override;
+  NextProtoStatus GetNextProto(std::string* proto) override;
 
   // SSLSocket implementation.
-  virtual int ExportKeyingMaterial(const base::StringPiece& label,
-                                   bool has_context,
-                                   const base::StringPiece& context,
-                                   unsigned char* out,
-                                   unsigned int outlen) override;
-  virtual int GetTLSUniqueChannelBinding(std::string* out) override;
+  int ExportKeyingMaterial(const base::StringPiece& label,
+                           bool has_context,
+                           const base::StringPiece& context,
+                           unsigned char* out,
+                           unsigned int outlen) override;
+  int GetTLSUniqueChannelBinding(std::string* out) override;
 
   // StreamSocket implementation.
-  virtual int Connect(const CompletionCallback& callback) override;
-  virtual void Disconnect() override;
-  virtual bool IsConnected() const override;
-  virtual bool IsConnectedAndIdle() const override;
-  virtual int GetPeerAddress(IPEndPoint* address) const override;
-  virtual int GetLocalAddress(IPEndPoint* address) const override;
-  virtual const BoundNetLog& NetLog() const override;
-  virtual void SetSubresourceSpeculation() override;
-  virtual void SetOmniboxSpeculation() override;
-  virtual bool WasEverUsed() const override;
-  virtual bool UsingTCPFastOpen() const override;
-  virtual bool GetSSLInfo(SSLInfo* ssl_info) override;
+  int Connect(const CompletionCallback& callback) override;
+  void Disconnect() override;
+  bool IsConnected() const override;
+  bool IsConnectedAndIdle() const override;
+  int GetPeerAddress(IPEndPoint* address) const override;
+  int GetLocalAddress(IPEndPoint* address) const override;
+  const BoundNetLog& NetLog() const override;
+  void SetSubresourceSpeculation() override;
+  void SetOmniboxSpeculation() override;
+  bool WasEverUsed() const override;
+  bool UsingTCPFastOpen() const override;
+  bool GetSSLInfo(SSLInfo* ssl_info) override;
 
   // Socket implementation.
-  virtual int Read(IOBuffer* buf,
-                   int buf_len,
-                   const CompletionCallback& callback) override;
-  virtual int Write(IOBuffer* buf,
-                    int buf_len,
-                    const CompletionCallback& callback) override;
-  virtual int SetReceiveBufferSize(int32 size) override;
-  virtual int SetSendBufferSize(int32 size) override;
-  virtual ChannelIDService* GetChannelIDService() const override;
+  int Read(IOBuffer* buf,
+           int buf_len,
+           const CompletionCallback& callback) override;
+  int Write(IOBuffer* buf,
+            int buf_len,
+            const CompletionCallback& callback) override;
+  int SetReceiveBufferSize(int32 size) override;
+  int SetSendBufferSize(int32 size) override;
+  ChannelIDService* GetChannelIDService() const override;
 
  protected:
   // SSLClientSocket implementation.
-  virtual scoped_refptr<X509Certificate> GetUnverifiedServerCertificateChain()
+  scoped_refptr<X509Certificate> GetUnverifiedServerCertificateChain()
       const override;
 
  private:
diff --git a/net/socket/ssl_client_socket_openssl.cc b/net/socket/ssl_client_socket_openssl.cc
index fc74d8c..2d1830f 100644
--- a/net/socket/ssl_client_socket_openssl.cc
+++ b/net/socket/ssl_client_socket_openssl.cc
@@ -24,13 +24,13 @@
 #include "crypto/scoped_openssl_types.h"
 #include "net/base/net_errors.h"
 #include "net/cert/cert_verifier.h"
+#include "net/cert/ct_ev_whitelist.h"
 #include "net/cert/ct_verifier.h"
 #include "net/cert/single_request_cert_verifier.h"
 #include "net/cert/x509_certificate_net_log_param.h"
 #include "net/cert/x509_util_openssl.h"
 #include "net/http/transport_security_state.h"
 #include "net/socket/ssl_session_cache_openssl.h"
-#include "net/ssl/openssl_ssl_util.h"
 #include "net/ssl/ssl_cert_request_info.h"
 #include "net/ssl/ssl_connection_status_flags.h"
 #include "net/ssl/ssl_info.h"
@@ -339,6 +339,7 @@
     : transport_send_busy_(false),
       transport_recv_busy_(false),
       pending_read_error_(kNoPendingReadResult),
+      pending_read_ssl_error_(SSL_ERROR_NONE),
       transport_read_error_(OK),
       transport_write_error_(OK),
       server_cert_chain_(new PeerCertificateChain(NULL)),
@@ -497,6 +498,9 @@
   user_write_buf_len_    = 0;
 
   pending_read_error_ = kNoPendingReadResult;
+  pending_read_ssl_error_ = SSL_ERROR_NONE;
+  pending_read_error_info_ = OpenSSLErrorInfo();
+
   transport_read_error_ = OK;
   transport_write_error_ = OK;
 
@@ -1103,6 +1107,21 @@
     result = ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN;
   }
 
+  scoped_refptr<ct::EVCertsWhitelist> ev_whitelist =
+      SSLConfigService::GetEVCertsWhitelist();
+  if (server_cert_verify_result_.cert_status & CERT_STATUS_IS_EV) {
+    if (ev_whitelist.get() && ev_whitelist->IsValid()) {
+      const SHA256HashValue fingerprint(
+          X509Certificate::CalculateFingerprint256(
+              server_cert_verify_result_.verified_cert->os_cert_handle()));
+
+      UMA_HISTOGRAM_BOOLEAN(
+          "Net.SSL_EVCertificateInWhitelist",
+          ev_whitelist->ContainsCertificateHash(
+              std::string(reinterpret_cast<const char*>(fingerprint.data), 8)));
+    }
+  }
+
   if (result == OK) {
     // Only check Certificate Transparency if there were no other errors with
     // the connection.
@@ -1320,7 +1339,14 @@
     if (rv == 0) {
       net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_RECEIVED,
                                     rv, user_read_buf_->data());
+    } else {
+      net_log_.AddEvent(
+          NetLog::TYPE_SSL_READ_ERROR,
+          CreateNetLogOpenSSLErrorCallback(rv, pending_read_ssl_error_,
+                                           pending_read_error_info_));
     }
+    pending_read_ssl_error_ = SSL_ERROR_NONE;
+    pending_read_error_info_ = OpenSSLErrorInfo();
     return rv;
   }
 
@@ -1355,8 +1381,10 @@
     if (client_auth_cert_needed_) {
       *next_result = ERR_SSL_CLIENT_AUTH_CERT_NEEDED;
     } else if (*next_result < 0) {
-      int err = SSL_get_error(ssl_, *next_result);
-      *next_result = MapOpenSSLError(err, err_tracer);
+      pending_read_ssl_error_ = SSL_get_error(ssl_, *next_result);
+      *next_result = MapOpenSSLErrorWithDetails(pending_read_ssl_error_,
+                                                err_tracer,
+                                                &pending_read_error_info_);
 
       // Many servers do not reliably send a close_notify alert when shutting
       // down a connection, and instead terminate the TCP connection. This is
@@ -1382,6 +1410,13 @@
   if (rv >= 0) {
     net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_RECEIVED, rv,
                                   user_read_buf_->data());
+  } else if (rv != ERR_IO_PENDING) {
+    net_log_.AddEvent(
+        NetLog::TYPE_SSL_READ_ERROR,
+        CreateNetLogOpenSSLErrorCallback(rv, pending_read_ssl_error_,
+                                         pending_read_error_info_));
+    pending_read_ssl_error_ = SSL_ERROR_NONE;
+    pending_read_error_info_ = OpenSSLErrorInfo();
   }
   return rv;
 }
@@ -1395,8 +1430,17 @@
     return rv;
   }
 
-  int err = SSL_get_error(ssl_, rv);
-  return MapOpenSSLError(err, err_tracer);
+  int ssl_error = SSL_get_error(ssl_, rv);
+  OpenSSLErrorInfo error_info;
+  int net_error = MapOpenSSLErrorWithDetails(ssl_error, err_tracer,
+                                             &error_info);
+
+  if (net_error != ERR_IO_PENDING) {
+    net_log_.AddEvent(
+        NetLog::TYPE_SSL_WRITE_ERROR,
+        CreateNetLogOpenSSLErrorCallback(net_error, ssl_error, error_info));
+  }
+  return net_error;
 }
 
 int SSLClientSocketOpenSSL::BufferSend(void) {
diff --git a/net/socket/ssl_client_socket_openssl.h b/net/socket/ssl_client_socket_openssl.h
index 8ed45c3..53d33c4 100644
--- a/net/socket/ssl_client_socket_openssl.h
+++ b/net/socket/ssl_client_socket_openssl.h
@@ -17,6 +17,7 @@
 #include "net/socket/client_socket_handle.h"
 #include "net/socket/ssl_client_socket.h"
 #include "net/ssl/channel_id_service.h"
+#include "net/ssl/openssl_ssl_util.h"
 #include "net/ssl/ssl_client_cert_type.h"
 #include "net/ssl/ssl_config_service.h"
 
@@ -209,6 +210,13 @@
   // indicates an error.
   int pending_read_error_;
 
+  // If there is a pending read result, the OpenSSL result code (output of
+  // SSL_get_error) associated with it.
+  int pending_read_ssl_error_;
+
+  // If there is a pending read result, the OpenSSLErrorInfo associated with it.
+  OpenSSLErrorInfo pending_read_error_info_;
+
   // Used by TransportReadComplete() to signify an error reading from the
   // transport socket. A value of OK indicates the socket is still
   // readable. EOFs are mapped to ERR_CONNECTION_CLOSED.
diff --git a/net/socket/ssl_server_socket_nss.h b/net/socket/ssl_server_socket_nss.h
index eddb543..d40b096 100644
--- a/net/socket/ssl_server_socket_nss.h
+++ b/net/socket/ssl_server_socket_nss.h
@@ -28,42 +28,44 @@
                      scoped_refptr<X509Certificate> certificate,
                      crypto::RSAPrivateKey* key,
                      const SSLConfig& ssl_config);
-  virtual ~SSLServerSocketNSS();
+  ~SSLServerSocketNSS() override;
 
   // SSLServerSocket interface.
-  virtual int Handshake(const CompletionCallback& callback) override;
+  int Handshake(const CompletionCallback& callback) override;
 
   // SSLSocket interface.
-  virtual int ExportKeyingMaterial(const base::StringPiece& label,
-                                   bool has_context,
-                                   const base::StringPiece& context,
-                                   unsigned char* out,
-                                   unsigned int outlen) override;
-  virtual int GetTLSUniqueChannelBinding(std::string* out) override;
+  int ExportKeyingMaterial(const base::StringPiece& label,
+                           bool has_context,
+                           const base::StringPiece& context,
+                           unsigned char* out,
+                           unsigned int outlen) override;
+  int GetTLSUniqueChannelBinding(std::string* out) override;
 
   // Socket interface (via StreamSocket).
-  virtual int Read(IOBuffer* buf, int buf_len,
-                   const CompletionCallback& callback) override;
-  virtual int Write(IOBuffer* buf, int buf_len,
-                    const CompletionCallback& callback) override;
-  virtual int SetReceiveBufferSize(int32 size) override;
-  virtual int SetSendBufferSize(int32 size) override;
+  int Read(IOBuffer* buf,
+           int buf_len,
+           const CompletionCallback& callback) override;
+  int Write(IOBuffer* buf,
+            int buf_len,
+            const CompletionCallback& callback) override;
+  int SetReceiveBufferSize(int32 size) override;
+  int SetSendBufferSize(int32 size) override;
 
   // StreamSocket implementation.
-  virtual int Connect(const CompletionCallback& callback) override;
-  virtual void Disconnect() override;
-  virtual bool IsConnected() const override;
-  virtual bool IsConnectedAndIdle() const override;
-  virtual int GetPeerAddress(IPEndPoint* address) const override;
-  virtual int GetLocalAddress(IPEndPoint* address) const override;
-  virtual const BoundNetLog& NetLog() const override;
-  virtual void SetSubresourceSpeculation() override;
-  virtual void SetOmniboxSpeculation() override;
-  virtual bool WasEverUsed() const override;
-  virtual bool UsingTCPFastOpen() const override;
-  virtual bool WasNpnNegotiated() const override;
-  virtual NextProto GetNegotiatedProtocol() const override;
-  virtual bool GetSSLInfo(SSLInfo* ssl_info) override;
+  int Connect(const CompletionCallback& callback) override;
+  void Disconnect() override;
+  bool IsConnected() const override;
+  bool IsConnectedAndIdle() const override;
+  int GetPeerAddress(IPEndPoint* address) const override;
+  int GetLocalAddress(IPEndPoint* address) const override;
+  const BoundNetLog& NetLog() const override;
+  void SetSubresourceSpeculation() override;
+  void SetOmniboxSpeculation() override;
+  bool WasEverUsed() const override;
+  bool UsingTCPFastOpen() const override;
+  bool WasNpnNegotiated() const override;
+  NextProto GetNegotiatedProtocol() const override;
+  bool GetSSLInfo(SSLInfo* ssl_info) override;
 
  private:
   enum State {
diff --git a/net/socket/tcp_listen_socket_unittest.cc b/net/socket/tcp_listen_socket_unittest.cc
index 41c41f8..b586426 100644
--- a/net/socket/tcp_listen_socket_unittest.cc
+++ b/net/socket/tcp_listen_socket_unittest.cc
@@ -275,13 +275,13 @@
     tester_ = NULL;
   }
 
-  virtual void SetUp() {
+  void SetUp() override {
     PlatformTest::SetUp();
     tester_ = new TCPListenSocketTester();
     tester_->SetUp();
   }
 
-  virtual void TearDown() {
+  void TearDown() override {
     PlatformTest::TearDown();
     tester_->TearDown();
     tester_ = NULL;
diff --git a/net/socket/transport_client_socket_pool_unittest.cc b/net/socket/transport_client_socket_pool_unittest.cc
index e3e9873..c0687ef 100644
--- a/net/socket/transport_client_socket_pool_unittest.cc
+++ b/net/socket/transport_client_socket_pool_unittest.cc
@@ -57,7 +57,7 @@
               NULL) {
   }
 
-  virtual ~TransportClientSocketPoolTest() {
+  ~TransportClientSocketPoolTest() override {
     internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(
         connect_backup_jobs_enabled_);
   }
diff --git a/net/socket/transport_client_socket_unittest.cc b/net/socket/transport_client_socket_unittest.cc
index ed68bf1..d01cbad 100644
--- a/net/socket/transport_client_socket_unittest.cc
+++ b/net/socket/transport_client_socket_unittest.cc
@@ -62,7 +62,7 @@
   void DidClose(StreamListenSocket* sock) override {}
 
   // Testcase hooks
-  virtual void SetUp();
+  void SetUp() override;
 
   void CloseServerSocket() {
     // delete the connected_sock_, which will close it.
diff --git a/net/socket/unix_domain_listen_socket_posix.h b/net/socket/unix_domain_listen_socket_posix.h
index b8f428d..82ec342 100644
--- a/net/socket/unix_domain_listen_socket_posix.h
+++ b/net/socket/unix_domain_listen_socket_posix.h
@@ -103,10 +103,10 @@
       const std::string& path,
       const std::string& fallback_path,
       const UnixDomainListenSocket::AuthCallback& auth_callback);
-  virtual ~UnixDomainListenSocketWithAbstractNamespaceFactory();
+  ~UnixDomainListenSocketWithAbstractNamespaceFactory() override;
 
   // UnixDomainListenSocketFactory:
-  virtual scoped_ptr<StreamListenSocket> CreateAndListen(
+  scoped_ptr<StreamListenSocket> CreateAndListen(
       StreamListenSocket::Delegate* delegate) const override;
 
  private:
diff --git a/net/socket/unix_domain_listen_socket_posix_unittest.cc b/net/socket/unix_domain_listen_socket_posix_unittest.cc
index bfa9200..aaf3623 100644
--- a/net/socket/unix_domain_listen_socket_posix_unittest.cc
+++ b/net/socket/unix_domain_listen_socket_posix_unittest.cc
@@ -167,12 +167,12 @@
     return temp_dir_.path().Append(socket_name);
   }
 
-  virtual void SetUp() override {
+  void SetUp() override {
     event_manager_ = new EventManager();
     socket_delegate_.reset(new TestListenSocketDelegate(event_manager_));
   }
 
-  virtual void TearDown() override {
+  void TearDown() override {
     socket_.reset();
     socket_delegate_.reset();
     event_manager_ = NULL;
diff --git a/net/socket/websocket_endpoint_lock_manager_unittest.cc b/net/socket/websocket_endpoint_lock_manager_unittest.cc
index 01c9dbc..1626aa9 100644
--- a/net/socket/websocket_endpoint_lock_manager_unittest.cc
+++ b/net/socket/websocket_endpoint_lock_manager_unittest.cc
@@ -93,7 +93,7 @@
  protected:
   WebSocketEndpointLockManagerTest()
       : instance_(WebSocketEndpointLockManager::GetInstance()) {}
-  virtual ~WebSocketEndpointLockManagerTest() {
+  ~WebSocketEndpointLockManagerTest() override {
     // If this check fails then subsequent tests may fail.
     CHECK(instance_->IsEmpty());
   }
diff --git a/net/socket/websocket_transport_client_socket_pool_unittest.cc b/net/socket/websocket_transport_client_socket_pool_unittest.cc
index 4d04c10..2189181 100644
--- a/net/socket/websocket_transport_client_socket_pool_unittest.cc
+++ b/net/socket/websocket_transport_client_socket_pool_unittest.cc
@@ -67,7 +67,7 @@
               &client_socket_factory_,
               NULL) {}
 
-  virtual ~WebSocketTransportClientSocketPoolTest() {
+  ~WebSocketTransportClientSocketPoolTest() override {
     ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
     EXPECT_TRUE(WebSocketEndpointLockManager::GetInstance()->IsEmpty());
   }
diff --git a/net/socket_stream/socket_stream_unittest.cc b/net/socket_stream/socket_stream_unittest.cc
index 6d47086..b5ee002 100644
--- a/net/socket_stream/socket_stream_unittest.cc
+++ b/net/socket_stream/socket_stream_unittest.cc
@@ -269,15 +269,13 @@
 
 class SocketStreamTest : public PlatformTest {
  public:
-  virtual ~SocketStreamTest() {}
-  virtual void SetUp() {
+  ~SocketStreamTest() override {}
+  void SetUp() override {
     mock_socket_factory_.reset();
     handshake_request_ = kWebSocketHandshakeRequest;
     handshake_response_ = kWebSocketHandshakeResponse;
   }
-  virtual void TearDown() {
-    mock_socket_factory_.reset();
-  }
+  void TearDown() override { mock_socket_factory_.reset(); }
 
   virtual void SetWebSocketHandshakeMessage(
       const char* request, const char* response) {
diff --git a/net/spdy/hpack_encoder_test.cc b/net/spdy/hpack_encoder_test.cc
index 96bbadd..adeebd4 100644
--- a/net/spdy/hpack_encoder_test.cc
+++ b/net/spdy/hpack_encoder_test.cc
@@ -101,7 +101,7 @@
         peer_(&encoder_),
         static_(peer_.table()->GetByIndex(1)) {}
 
-  virtual void SetUp() {
+  void SetUp() override {
     // Populate dynamic entries into the table fixture. For simplicity each
     // entry has name.size() + value.size() == 10.
     key_1_ = peer_.table()->TryAddEntry("key1", "value1");
diff --git a/net/spdy/hpack_input_stream_test.cc b/net/spdy/hpack_input_stream_test.cc
index c5fef63..a88acb2 100644
--- a/net/spdy/hpack_input_stream_test.cc
+++ b/net/spdy/hpack_input_stream_test.cc
@@ -26,7 +26,7 @@
 
 class HpackInputStreamTest : public ::testing::Test {
  public:
-  virtual void SetUp() {
+  void SetUp() override {
     std::vector<HpackHuffmanSymbol> code = HpackHuffmanCode();
     EXPECT_TRUE(huffman_table_.Initialize(&code[0], code.size()));
   }
diff --git a/net/spdy/hpack_round_trip_test.cc b/net/spdy/hpack_round_trip_test.cc
index f5667b5..aae7584 100644
--- a/net/spdy/hpack_round_trip_test.cc
+++ b/net/spdy/hpack_round_trip_test.cc
@@ -28,7 +28,7 @@
       : encoder_(ObtainHpackHuffmanTable()),
         decoder_(ObtainHpackHuffmanTable()) {}
 
-  virtual void SetUp() {
+  void SetUp() override {
     // Use a small table size to tickle eviction handling.
     encoder_.ApplyHeaderTableSizeSetting(256);
     decoder_.ApplyHeaderTableSizeSetting(256);
diff --git a/net/spdy/spdy_frame_builder_test.cc b/net/spdy/spdy_frame_builder_test.cc
index 73cad24..3854558 100644
--- a/net/spdy/spdy_frame_builder_test.cc
+++ b/net/spdy/spdy_frame_builder_test.cc
@@ -12,9 +12,7 @@
 
 class SpdyFrameBuilderTest : public ::testing::TestWithParam<SpdyMajorVersion> {
  protected:
-  virtual void SetUp() {
-    spdy_version_ = GetParam();
-  }
+  void SetUp() override { spdy_version_ = GetParam(); }
 
   // Major version of SPDY protocol to be used.
   SpdyMajorVersion spdy_version_;
diff --git a/net/spdy/spdy_framer_test.cc b/net/spdy/spdy_framer_test.cc
index d55e072..e7eb092 100644
--- a/net/spdy/spdy_framer_test.cc
+++ b/net/spdy/spdy_framer_test.cc
@@ -610,7 +610,7 @@
 
 class SpdyFramerTest : public ::testing::TestWithParam<SpdyMajorVersion> {
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     spdy_version_ = GetParam();
     spdy_version_ch_ = static_cast<unsigned char>(
         SpdyConstants::SerializeMajorVersion(spdy_version_));
diff --git a/net/spdy/spdy_headers_block_parser_test.cc b/net/spdy/spdy_headers_block_parser_test.cc
index c1d48de..d8cbe31 100644
--- a/net/spdy/spdy_headers_block_parser_test.cc
+++ b/net/spdy/spdy_headers_block_parser_test.cc
@@ -38,7 +38,7 @@
   virtual ~SpdyHeadersBlockParserTest() {}
 
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     // Create a parser using the mock handler.
     spdy_version_ = GetParam();
     parser_.reset(new SpdyHeadersBlockParser(spdy_version_, &handler_));
diff --git a/net/spdy/spdy_http_stream_unittest.cc b/net/spdy/spdy_http_stream_unittest.cc
index f1c1de2..0e8fdb0 100644
--- a/net/spdy/spdy_http_stream_unittest.cc
+++ b/net/spdy/spdy_http_stream_unittest.cc
@@ -79,7 +79,7 @@
   OrderedSocketData* data() { return data_.get(); }
 
  protected:
-  virtual void TearDown() override {
+  void TearDown() override {
     crypto::ECSignatureCreator::SetFactoryForTesting(NULL);
     base::MessageLoop::current()->RunUntilIdle();
   }
diff --git a/net/spdy/spdy_network_transaction_unittest.cc b/net/spdy/spdy_network_transaction_unittest.cc
index 58dc73b..a68615f 100644
--- a/net/spdy/spdy_network_transaction_unittest.cc
+++ b/net/spdy/spdy_network_transaction_unittest.cc
@@ -127,7 +127,7 @@
     base::RunLoop().RunUntilIdle();
   }
 
-  virtual void SetUp() {
+  void SetUp() override {
     google_get_request_initialized_ = false;
     google_post_request_initialized_ = false;
     google_chunked_post_request_initialized_ = false;
diff --git a/net/spdy/spdy_protocol_test.cc b/net/spdy/spdy_protocol_test.cc
index 0e49207..486a772 100644
--- a/net/spdy/spdy_protocol_test.cc
+++ b/net/spdy/spdy_protocol_test.cc
@@ -27,7 +27,7 @@
 class SpdyProtocolTest
     : public ::testing::TestWithParam<SpdyProtocolTestTypes> {
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     spdy_version_ = static_cast<SpdyMajorVersion>(GetParam());
   }
 
diff --git a/net/spdy/spdy_proxy_client_socket_unittest.cc b/net/spdy/spdy_proxy_client_socket_unittest.cc
index 26785c6..92e446e 100644
--- a/net/spdy/spdy_proxy_client_socket_unittest.cc
+++ b/net/spdy/spdy_proxy_client_socket_unittest.cc
@@ -66,7 +66,7 @@
  public:
   SpdyProxyClientSocketTest();
 
-  virtual void TearDown();
+  void TearDown() override;
 
  protected:
   void Initialize(MockRead* reads, size_t reads_count, MockWrite* writes,
diff --git a/net/spdy/spdy_session_unittest.cc b/net/spdy/spdy_session_unittest.cc
index e56d9ef..c6447bf 100644
--- a/net/spdy/spdy_session_unittest.cc
+++ b/net/spdy/spdy_session_unittest.cc
@@ -121,9 +121,7 @@
         HttpNetworkSession::NORMAL_SOCKET_POOL, old_max_group_sockets_);
   }
 
-  virtual void SetUp() override {
-    g_time_delta = base::TimeDelta();
-  }
+  void SetUp() override { g_time_delta = base::TimeDelta(); }
 
   void CreateDeterministicNetworkSession() {
     http_session_ =
diff --git a/net/spdy/spdy_stream_unittest.cc b/net/spdy/spdy_stream_unittest.cc
index f754be6..a6926ab 100644
--- a/net/spdy/spdy_stream_unittest.cc
+++ b/net/spdy/spdy_stream_unittest.cc
@@ -57,9 +57,7 @@
     return CreateInsecureSpdySession(session_, key, BoundNetLog());
   }
 
-  virtual void TearDown() {
-    base::MessageLoop::current()->RunUntilIdle();
-  }
+  void TearDown() override { base::MessageLoop::current()->RunUntilIdle(); }
 
   void RunResumeAfterUnstallRequestResponseTest(
       const UnstallFunction& unstall_function);
diff --git a/net/spdy/spdy_websocket_stream_unittest.cc b/net/spdy/spdy_websocket_stream_unittest.cc
index fd94969..fc54884 100644
--- a/net/spdy/spdy_websocket_stream_unittest.cc
+++ b/net/spdy/spdy_websocket_stream_unittest.cc
@@ -196,7 +196,7 @@
         created_stream_id_(0) {}
   virtual ~SpdyWebSocketStreamTest() {}
 
-  virtual void SetUp() {
+  void SetUp() override {
     host_port_pair_.set_host("example.com");
     host_port_pair_.set_port(80);
     spdy_session_key_ = SpdySessionKey(host_port_pair_,
@@ -208,9 +208,7 @@
             SETTINGS_FLAG_PERSISTED, spdy_settings_value_to_set_);
   }
 
-  virtual void TearDown() {
-    base::MessageLoop::current()->RunUntilIdle();
-  }
+  void TearDown() override { base::MessageLoop::current()->RunUntilIdle(); }
 
   void Prepare(SpdyStreamId stream_id) {
     stream_id_ = stream_id;
diff --git a/net/ssl/client_cert_store_nss.h b/net/ssl/client_cert_store_nss.h
index 38895aa..f6d8099 100644
--- a/net/ssl/client_cert_store_nss.h
+++ b/net/ssl/client_cert_store_nss.h
@@ -27,12 +27,12 @@
 
   explicit ClientCertStoreNSS(
       const PasswordDelegateFactory& password_delegate_factory);
-  virtual ~ClientCertStoreNSS();
+  ~ClientCertStoreNSS() override;
 
   // ClientCertStore:
-  virtual void GetClientCerts(const SSLCertRequestInfo& cert_request_info,
-                              CertificateList* selected_certs,
-                              const base::Closure& callback) override;
+  void GetClientCerts(const SSLCertRequestInfo& cert_request_info,
+                      CertificateList* selected_certs,
+                      const base::Closure& callback) override;
 
  protected:
   // Examines the certificates in |cert_list| to find all certificates that
diff --git a/net/ssl/ssl_config_service.cc b/net/ssl/ssl_config_service.cc
index 1cc6def..4661930 100644
--- a/net/ssl/ssl_config_service.cc
+++ b/net/ssl/ssl_config_service.cc
@@ -14,27 +14,34 @@
     : observer_list_(ObserverList<Observer>::NOTIFY_EXISTING_ONLY) {
 }
 
-// GlobalCRLSet holds a reference to the global CRLSet. It simply wraps a lock
-// around a scoped_refptr so that getting a reference doesn't race with
-// updating the CRLSet.
-class GlobalCRLSet {
+// GlobalSSLObject holds a reference to a global SSL object, such as the
+// CRLSet or the EVCertsWhitelist. It simply wraps a lock  around a
+// scoped_refptr so that getting a reference doesn't race with
+// updating the global object.
+template <class T>
+class GlobalSSLObject {
  public:
-  void Set(const scoped_refptr<CRLSet>& new_crl_set) {
+  void Set(const scoped_refptr<T>& new_ssl_object) {
     base::AutoLock locked(lock_);
-    crl_set_ = new_crl_set;
+    ssl_object_ = new_ssl_object;
   }
 
-  scoped_refptr<CRLSet> Get() const {
+  scoped_refptr<T> Get() const {
     base::AutoLock locked(lock_);
-    return crl_set_;
+    return ssl_object_;
   }
 
  private:
-  scoped_refptr<CRLSet> crl_set_;
+  scoped_refptr<T> ssl_object_;
   mutable base::Lock lock_;
 };
 
+typedef GlobalSSLObject<CRLSet> GlobalCRLSet;
+typedef GlobalSSLObject<ct::EVCertsWhitelist> GlobalEVCertsWhitelist;
+
 base::LazyInstance<GlobalCRLSet>::Leaky g_crl_set = LAZY_INSTANCE_INITIALIZER;
+base::LazyInstance<GlobalEVCertsWhitelist>::Leaky g_ev_whitelist =
+    LAZY_INSTANCE_INITIALIZER;
 
 // static
 void SSLConfigService::SetCRLSet(scoped_refptr<CRLSet> crl_set) {
@@ -47,6 +54,17 @@
   return g_crl_set.Get().Get();
 }
 
+// static
+void SSLConfigService::SetEVCertsWhitelist(
+    scoped_refptr<ct::EVCertsWhitelist> ev_whitelist) {
+  g_ev_whitelist.Get().Set(ev_whitelist);
+}
+
+// static
+scoped_refptr<ct::EVCertsWhitelist> SSLConfigService::GetEVCertsWhitelist() {
+  return g_ev_whitelist.Get().Get();
+}
+
 void SSLConfigService::AddObserver(Observer* observer) {
   observer_list_.AddObserver(observer);
 }
diff --git a/net/ssl/ssl_config_service.h b/net/ssl/ssl_config_service.h
index 51c29ca..e074309 100644
--- a/net/ssl/ssl_config_service.h
+++ b/net/ssl/ssl_config_service.h
@@ -11,6 +11,7 @@
 #include "base/observer_list.h"
 #include "net/base/net_export.h"
 #include "net/cert/crl_set.h"
+#include "net/cert/ct_ev_whitelist.h"
 #include "net/ssl/ssl_config.h"
 
 namespace net {
@@ -50,6 +51,11 @@
   static void SetCRLSet(scoped_refptr<CRLSet> crl_set);
   static scoped_refptr<CRLSet> GetCRLSet();
 
+  // Sets and gets the current, global EV certificates whitelist
+  static void SetEVCertsWhitelist(
+      scoped_refptr<ct::EVCertsWhitelist> ev_whitelist);
+  static scoped_refptr<ct::EVCertsWhitelist> GetEVCertsWhitelist();
+
   // Add an observer of this service.
   void AddObserver(Observer* observer);
 
diff --git a/net/test/embedded_test_server/embedded_test_server_unittest.cc b/net/test/embedded_test_server/embedded_test_server_unittest.cc
index bbe321b..e102117 100644
--- a/net/test/embedded_test_server/embedded_test_server_unittest.cc
+++ b/net/test/embedded_test_server/embedded_test_server_unittest.cc
@@ -49,7 +49,7 @@
         io_thread_("io_thread") {
   }
 
-  virtual void SetUp() override {
+  void SetUp() override {
     base::Thread::Options thread_options;
     thread_options.message_loop_type = base::MessageLoop::TYPE_IO;
     ASSERT_TRUE(io_thread_.StartWithOptions(thread_options));
@@ -61,7 +61,7 @@
     ASSERT_TRUE(server_->InitializeAndWaitUntilReady());
   }
 
-  virtual void TearDown() override {
+  void TearDown() override {
     ASSERT_TRUE(server_->ShutdownAndWaitUntilComplete());
   }
 
diff --git a/net/test/run_all_unittests.cc b/net/test/run_all_unittests.cc
index a035057..12df717 100644
--- a/net/test/run_all_unittests.cc
+++ b/net/test/run_all_unittests.cc
@@ -23,6 +23,10 @@
 #include "net/proxy/proxy_resolver_v8.h"
 #endif
 
+#ifdef V8_USE_EXTERNAL_STARTUP_DATA
+#include "gin/public/isolate_holder.h"
+#endif
+
 using net::internal::ClientSocketPoolBaseHelper;
 using net::SpdySession;
 
@@ -57,6 +61,10 @@
   // single-threaded.
   net::EnableSSLServerSockets();
 
+#ifdef V8_USE_EXTERNAL_STARTUP_DATA
+  gin::IsolateHolder::LoadV8Snapshot();
+#endif
+
 #if !defined(OS_IOS)
   net::ProxyResolverV8::EnsureIsolateCreated();
 #endif
diff --git a/net/tools/balsa/balsa_frame_test.cc b/net/tools/balsa/balsa_frame_test.cc
index 334f5ef..4a00a66 100644
--- a/net/tools/balsa/balsa_frame_test.cc
+++ b/net/tools/balsa/balsa_frame_test.cc
@@ -58,7 +58,7 @@
 
 class BalsaFrameTest : public ::testing::Test {
  public:
-  virtual void SetUp() override {
+  void SetUp() override {
     frame_.reset(new BalsaFrame);
     frame_headers_.reset(new BalsaHeaders);
     visitor_.reset(new Visitor);
diff --git a/net/tools/balsa/balsa_headers_test.cc b/net/tools/balsa/balsa_headers_test.cc
index b1479c6..3dc8eb3 100644
--- a/net/tools/balsa/balsa_headers_test.cc
+++ b/net/tools/balsa/balsa_headers_test.cc
@@ -19,7 +19,7 @@
 
 class BalsaBufferTest : public ::testing::Test {
  public:
-  virtual void SetUp() override {
+  void SetUp() override {
     buffer_.reset(new BalsaBuffer);
     anotherBuffer_.reset(new BalsaBuffer);
   }
@@ -33,9 +33,7 @@
 
 class BalsaHeadersTest: public ::testing::Test {
  public:
-  virtual void SetUp() override {
-    headers_.reset(new BalsaHeaders);
-  }
+  void SetUp() override { headers_.reset(new BalsaHeaders); }
 
  protected:
   scoped_ptr<BalsaHeaders> headers_;
diff --git a/net/tools/balsa/noop_balsa_visitor.h b/net/tools/balsa/noop_balsa_visitor.h
index c47b0b3..89e9719 100644
--- a/net/tools/balsa/noop_balsa_visitor.h
+++ b/net/tools/balsa/noop_balsa_visitor.h
@@ -17,39 +17,38 @@
 class NoOpBalsaVisitor : public BalsaVisitorInterface {
  public:
   NoOpBalsaVisitor() { }
-  virtual ~NoOpBalsaVisitor() { }
+  ~NoOpBalsaVisitor() override {}
 
-  virtual void ProcessBodyInput(const char* input, size_t size) override { }
-  virtual void ProcessBodyData(const char* input, size_t size) override { }
-  virtual void ProcessHeaderInput(const char* input, size_t size) override { }
-  virtual void ProcessTrailerInput(const char* input, size_t size) override { }
-  virtual void ProcessHeaders(const BalsaHeaders& headers) override { }
+  void ProcessBodyInput(const char* input, size_t size) override {}
+  void ProcessBodyData(const char* input, size_t size) override {}
+  void ProcessHeaderInput(const char* input, size_t size) override {}
+  void ProcessTrailerInput(const char* input, size_t size) override {}
+  void ProcessHeaders(const BalsaHeaders& headers) override {}
 
-  virtual void ProcessRequestFirstLine(const char* line_input,
-                                       size_t line_length,
-                                       const char* method_input,
-                                       size_t method_length,
-                                       const char* request_uri_input,
-                                       size_t request_uri_length,
-                                       const char* version_input,
-                                       size_t version_length) override { }
-  virtual void ProcessResponseFirstLine(const char* line_input,
-                                        size_t line_length,
-                                        const char* version_input,
-                                        size_t version_length,
-                                        const char* status_input,
-                                        size_t status_length,
-                                        const char* reason_input,
-                                        size_t reason_length) override { }
-  virtual void ProcessChunkLength(size_t chunk_length) override { }
-  virtual void ProcessChunkExtensions(const char* input, size_t size) override {
-  }
-  virtual void HeaderDone() override { }
-  virtual void MessageDone() override { }
-  virtual void HandleHeaderError(BalsaFrame* framer) override { }
-  virtual void HandleHeaderWarning(BalsaFrame* framer) override { }
-  virtual void HandleChunkingError(BalsaFrame* framer) override { }
-  virtual void HandleBodyError(BalsaFrame* framer) override { }
+  void ProcessRequestFirstLine(const char* line_input,
+                               size_t line_length,
+                               const char* method_input,
+                               size_t method_length,
+                               const char* request_uri_input,
+                               size_t request_uri_length,
+                               const char* version_input,
+                               size_t version_length) override {}
+  void ProcessResponseFirstLine(const char* line_input,
+                                size_t line_length,
+                                const char* version_input,
+                                size_t version_length,
+                                const char* status_input,
+                                size_t status_length,
+                                const char* reason_input,
+                                size_t reason_length) override {}
+  void ProcessChunkLength(size_t chunk_length) override {}
+  void ProcessChunkExtensions(const char* input, size_t size) override {}
+  void HeaderDone() override {}
+  void MessageDone() override {}
+  void HandleHeaderError(BalsaFrame* framer) override {}
+  void HandleHeaderWarning(BalsaFrame* framer) override {}
+  void HandleChunkingError(BalsaFrame* framer) override {}
+  void HandleBodyError(BalsaFrame* framer) override {}
 
  private:
   DISALLOW_COPY_AND_ASSIGN(NoOpBalsaVisitor);
diff --git a/net/tools/epoll_server/epoll_server.cc b/net/tools/epoll_server/epoll_server.cc
index 7ccae1d..72bb0db 100644
--- a/net/tools/epoll_server/epoll_server.cc
+++ b/net/tools/epoll_server/epoll_server.cc
@@ -60,7 +60,7 @@
 // Clears the pipe and returns.  Used for waking the epoll server up.
 class ReadPipeCallback : public EpollCallbackInterface {
  public:
-  virtual void OnEvent(int fd, EpollEvent* event) override {
+  void OnEvent(int fd, EpollEvent* event) override {
     DCHECK(event->in_events == EPOLLIN);
     int data;
     int data_read = 1;
@@ -69,10 +69,10 @@
       data_read = read(fd, &data, sizeof(data));
     }
   }
-  virtual void OnShutdown(EpollServer *eps, int fd) override {}
-  virtual void OnRegistration(EpollServer*, int, int) override {}
-  virtual void OnModification(int, int) override {}       // COV_NF_LINE
-  virtual void OnUnregistration(int, bool) override {}    // COV_NF_LINE
+  void OnShutdown(EpollServer* eps, int fd) override {}
+  void OnRegistration(EpollServer*, int, int) override {}
+  void OnModification(int, int) override {}     // COV_NF_LINE
+  void OnUnregistration(int, bool) override {}  // COV_NF_LINE
 };
 
 ////////////////////////////////////////////////////////////////////////////////
diff --git a/net/tools/epoll_server/epoll_server.h b/net/tools/epoll_server/epoll_server.h
index e8f1396..92d6555 100644
--- a/net/tools/epoll_server/epoll_server.h
+++ b/net/tools/epoll_server/epoll_server.h
@@ -1019,21 +1019,21 @@
  public:
   EpollAlarm();
 
-  virtual ~EpollAlarm();
+  ~EpollAlarm() override;
 
   // Marks the alarm as unregistered and returns 0.  The return value may be
   // safely ignored by subclasses.
-  virtual int64 OnAlarm() override;
+  int64 OnAlarm() override;
 
   // Marks the alarm as registered, and stores the token.
-  virtual void OnRegistration(const EpollServer::AlarmRegToken& token,
-                              EpollServer* eps) override;
+  void OnRegistration(const EpollServer::AlarmRegToken& token,
+                      EpollServer* eps) override;
 
   // Marks the alarm as unregistered.
-  virtual void OnUnregistration() override;
+  void OnUnregistration() override;
 
   // Marks the alarm as unregistered.
-  virtual void OnShutdown(EpollServer* eps) override;
+  void OnShutdown(EpollServer* eps) override;
 
   // If the alarm was registered, unregister it.
   void UnregisterIfRegistered();
diff --git a/net/tools/quic/end_to_end_test.cc b/net/tools/quic/end_to_end_test.cc
index edcd0ce..abf0bab 100644
--- a/net/tools/quic/end_to_end_test.cc
+++ b/net/tools/quic/end_to_end_test.cc
@@ -158,11 +158,12 @@
                  QuicDispatcher* dispatcher)
       : writer_factory_(writer_factory),
         dispatcher_(dispatcher) {}
-  virtual ~ServerDelegate() {}
-  virtual void OnPacketSent(WriteResult result) override {
+  ~ServerDelegate() override {}
+  void OnPacketSent(WriteResult result) override {
     writer_factory_->OnPacketSent(result);
   }
-  virtual void OnCanWrite() override { dispatcher_->OnCanWrite(); }
+  void OnCanWrite() override { dispatcher_->OnCanWrite(); }
+
  private:
   TestWriterFactory* writer_factory_;
   QuicDispatcher* dispatcher_;
@@ -171,9 +172,9 @@
 class ClientDelegate : public PacketDroppingTestWriter::Delegate {
  public:
   explicit ClientDelegate(QuicClient* client) : client_(client) {}
-  virtual ~ClientDelegate() {}
-  virtual void OnPacketSent(WriteResult result) override {}
-  virtual void OnCanWrite() override {
+  ~ClientDelegate() override {}
+  void OnPacketSent(WriteResult result) override {}
+  void OnCanWrite() override {
     EpollEvent event(EPOLLOUT, false);
     client_->OnEvent(client_->fd(), &event);
   }
@@ -320,16 +321,14 @@
     return client_->client()->connected();
   }
 
-  virtual void SetUp() override {
+  void SetUp() override {
     // The ownership of these gets transferred to the QuicPacketWriterWrapper
     // and TestWriterFactory when Initialize() is executed.
     client_writer_ = new PacketDroppingTestWriter();
     server_writer_ = new PacketDroppingTestWriter();
   }
 
-  virtual void TearDown() override {
-    StopServer();
-  }
+  void TearDown() override { StopServer(); }
 
   void StartServer() {
     server_thread_.reset(
@@ -1102,19 +1101,16 @@
     self_address_ = IPEndPoint(ip, 0);
   }
 
-  virtual WriteResult WritePacket(
-      const char* buffer,
-      size_t buf_len,
-      const IPAddressNumber& real_self_address,
-      const IPEndPoint& peer_address) override {
+  WriteResult WritePacket(const char* buffer,
+                          size_t buf_len,
+                          const IPAddressNumber& real_self_address,
+                          const IPEndPoint& peer_address) override {
     // Use wrong address!
     return QuicPacketWriterWrapper::WritePacket(
         buffer, buf_len, self_address_.address(), peer_address);
   }
 
-  virtual bool IsWriteBlockedDataBuffered() const override {
-    return false;
-  }
+  bool IsWriteBlockedDataBuffered() const override { return false; }
 
   IPEndPoint self_address_;
 };
diff --git a/net/tools/quic/quic_client.h b/net/tools/quic/quic_client.h
index ae5c2d9..035f70c 100644
--- a/net/tools/quic/quic_client.h
+++ b/net/tools/quic/quic_client.h
@@ -61,7 +61,7 @@
              const QuicConfig& config,
              EpollServer* epoll_server);
 
-  virtual ~QuicClient();
+  ~QuicClient() override;
 
   // Initializes the client to create a connection. Should be called exactly
   // once before calling StartConnect or Connect. Returns true if the
@@ -105,19 +105,17 @@
   bool WaitForEvents();
 
   // From EpollCallbackInterface
-  virtual void OnRegistration(EpollServer* eps,
-                              int fd,
-                              int event_mask) override {}
-  virtual void OnModification(int fd, int event_mask) override {}
-  virtual void OnEvent(int fd, EpollEvent* event) override;
+  void OnRegistration(EpollServer* eps, int fd, int event_mask) override {}
+  void OnModification(int fd, int event_mask) override {}
+  void OnEvent(int fd, EpollEvent* event) override;
   // |fd_| can be unregistered without the client being disconnected. This
   // happens in b3m QuicProber where we unregister |fd_| to feed in events to
   // the client from the SelectServer.
-  virtual void OnUnregistration(int fd, bool replaced) override {}
-  virtual void OnShutdown(EpollServer* eps, int fd) override {}
+  void OnUnregistration(int fd, bool replaced) override {}
+  void OnShutdown(EpollServer* eps, int fd) override {}
 
   // QuicDataStream::Visitor
-  virtual void OnClose(QuicDataStream* stream) override;
+  void OnClose(QuicDataStream* stream) override;
 
   QuicClientSession* session() { return session_.get(); }
 
@@ -192,9 +190,9 @@
   class DummyPacketWriterFactory : public QuicConnection::PacketWriterFactory {
    public:
     DummyPacketWriterFactory(QuicPacketWriter* writer);
-    virtual ~DummyPacketWriterFactory();
+    ~DummyPacketWriterFactory() override;
 
-    virtual QuicPacketWriter* Create(QuicConnection* connection) const override;
+    QuicPacketWriter* Create(QuicConnection* connection) const override;
 
    private:
     QuicPacketWriter* writer_;
diff --git a/net/tools/quic/quic_client_session.h b/net/tools/quic/quic_client_session.h
index 5e0624a..15dd1c8 100644
--- a/net/tools/quic/quic_client_session.h
+++ b/net/tools/quic/quic_client_session.h
@@ -26,20 +26,19 @@
 class QuicClientSession : public QuicClientSessionBase {
  public:
   QuicClientSession(const QuicConfig& config, QuicConnection* connection);
-  virtual ~QuicClientSession();
+  ~QuicClientSession() override;
 
   // QuicClientSessionBase methods:
-  virtual void OnProofValid(
-      const QuicCryptoClientConfig::CachedState& cached) override;
-  virtual void OnProofVerifyDetailsAvailable(
+  void OnProofValid(const QuicCryptoClientConfig::CachedState& cached) override;
+  void OnProofVerifyDetailsAvailable(
       const ProofVerifyDetails& verify_details) override;
 
   void InitializeSession(const QuicServerId& server_id,
                          QuicCryptoClientConfig* config);
 
   // QuicSession methods:
-  virtual QuicSpdyClientStream* CreateOutgoingDataStream() override;
-  virtual QuicCryptoClientStream* GetCryptoStream() override;
+  QuicSpdyClientStream* CreateOutgoingDataStream() override;
+  QuicCryptoClientStream* GetCryptoStream() override;
 
   // Performs a crypto handshake with the server. Returns true if the crypto
   // handshake is started successfully.
@@ -52,7 +51,7 @@
 
  protected:
   // QuicSession methods:
-  virtual QuicDataStream* CreateIncomingDataStream(QuicStreamId id) override;
+  QuicDataStream* CreateIncomingDataStream(QuicStreamId id) override;
 
  private:
   scoped_ptr<QuicCryptoClientStream> crypto_stream_;
diff --git a/net/tools/quic/quic_default_packet_writer.h b/net/tools/quic/quic_default_packet_writer.h
index 47925c3..3f37fb4 100644
--- a/net/tools/quic/quic_default_packet_writer.h
+++ b/net/tools/quic/quic_default_packet_writer.h
@@ -19,16 +19,16 @@
 class QuicDefaultPacketWriter : public QuicPacketWriter {
  public:
   explicit QuicDefaultPacketWriter(int fd);
-  virtual ~QuicDefaultPacketWriter();
+  ~QuicDefaultPacketWriter() override;
 
   // QuicPacketWriter
-  virtual WriteResult WritePacket(const char* buffer,
-                                  size_t buf_len,
-                                  const IPAddressNumber& self_address,
-                                  const IPEndPoint& peer_address) override;
-  virtual bool IsWriteBlockedDataBuffered() const override;
-  virtual bool IsWriteBlocked() const override;
-  virtual void SetWritable() override;
+  WriteResult WritePacket(const char* buffer,
+                          size_t buf_len,
+                          const IPAddressNumber& self_address,
+                          const IPEndPoint& peer_address) override;
+  bool IsWriteBlockedDataBuffered() const override;
+  bool IsWriteBlocked() const override;
+  void SetWritable() override;
 
   void set_fd(int fd) { fd_ = fd; }
 
diff --git a/net/tools/quic/quic_dispatcher.cc b/net/tools/quic/quic_dispatcher.cc
index 5f0e2da..747785e 100644
--- a/net/tools/quic/quic_dispatcher.cc
+++ b/net/tools/quic/quic_dispatcher.cc
@@ -32,7 +32,7 @@
       : dispatcher_(dispatcher) {
   }
 
-  virtual int64 OnAlarm() override {
+  int64 OnAlarm() override {
     EpollAlarm::OnAlarm();
     dispatcher_->DeleteSessions();
     return 0;
@@ -49,23 +49,21 @@
         connection_id_(0) {}
 
   // QuicFramerVisitorInterface implementation
-  virtual void OnPacket() override {}
-  virtual bool OnUnauthenticatedPublicHeader(
+  void OnPacket() override {}
+  bool OnUnauthenticatedPublicHeader(
       const QuicPacketPublicHeader& header) override {
     connection_id_ = header.connection_id;
     return dispatcher_->OnUnauthenticatedPublicHeader(header);
   }
-  virtual bool OnUnauthenticatedHeader(
-      const QuicPacketHeader& header) override {
+  bool OnUnauthenticatedHeader(const QuicPacketHeader& header) override {
     dispatcher_->OnUnauthenticatedHeader(header);
     return false;
   }
-  virtual void OnError(QuicFramer* framer) override {
+  void OnError(QuicFramer* framer) override {
     DVLOG(1) << QuicUtils::ErrorToString(framer->error());
   }
 
-  virtual bool OnProtocolVersionMismatch(
-      QuicVersion /*received_version*/) override {
+  bool OnProtocolVersionMismatch(QuicVersion /*received_version*/) override {
     if (dispatcher_->time_wait_list_manager()->IsConnectionIdInTimeWait(
             connection_id_)) {
       // Keep processing after protocol mismatch - this will be dealt with by
@@ -81,77 +79,66 @@
   // The following methods should never get called because we always return
   // false from OnUnauthenticatedHeader().  As a result, we never process the
   // payload of the packet.
-  virtual void OnPublicResetPacket(
-      const QuicPublicResetPacket& /*packet*/) override {
+  void OnPublicResetPacket(const QuicPublicResetPacket& /*packet*/) override {
     DCHECK(false);
   }
-  virtual void OnVersionNegotiationPacket(
+  void OnVersionNegotiationPacket(
       const QuicVersionNegotiationPacket& /*packet*/) override {
     DCHECK(false);
   }
-  virtual void OnDecryptedPacket(EncryptionLevel level) override {
-    DCHECK(false);
-  }
-  virtual bool OnPacketHeader(const QuicPacketHeader& /*header*/) override {
+  void OnDecryptedPacket(EncryptionLevel level) override { DCHECK(false); }
+  bool OnPacketHeader(const QuicPacketHeader& /*header*/) override {
     DCHECK(false);
     return false;
   }
-  virtual void OnRevivedPacket() override {
+  void OnRevivedPacket() override { DCHECK(false); }
+  void OnFecProtectedPayload(StringPiece /*payload*/) override {
     DCHECK(false);
   }
-  virtual void OnFecProtectedPayload(StringPiece /*payload*/) override {
-    DCHECK(false);
-  }
-  virtual bool OnStreamFrame(const QuicStreamFrame& /*frame*/) override {
+  bool OnStreamFrame(const QuicStreamFrame& /*frame*/) override {
     DCHECK(false);
     return false;
   }
-  virtual bool OnAckFrame(const QuicAckFrame& /*frame*/) override {
+  bool OnAckFrame(const QuicAckFrame& /*frame*/) override {
     DCHECK(false);
     return false;
   }
-  virtual bool OnCongestionFeedbackFrame(
+  bool OnCongestionFeedbackFrame(
       const QuicCongestionFeedbackFrame& /*frame*/) override {
     DCHECK(false);
     return false;
   }
-  virtual bool OnStopWaitingFrame(
-      const QuicStopWaitingFrame& /*frame*/) override {
+  bool OnStopWaitingFrame(const QuicStopWaitingFrame& /*frame*/) override {
     DCHECK(false);
     return false;
   }
-  virtual bool OnPingFrame(const QuicPingFrame& /*frame*/) override {
+  bool OnPingFrame(const QuicPingFrame& /*frame*/) override {
     DCHECK(false);
     return false;
   }
-  virtual bool OnRstStreamFrame(const QuicRstStreamFrame& /*frame*/) override {
+  bool OnRstStreamFrame(const QuicRstStreamFrame& /*frame*/) override {
     DCHECK(false);
     return false;
   }
-  virtual bool OnConnectionCloseFrame(
-      const QuicConnectionCloseFrame & /*frame*/) override {
+  bool OnConnectionCloseFrame(
+      const QuicConnectionCloseFrame& /*frame*/) override {
     DCHECK(false);
     return false;
   }
-  virtual bool OnGoAwayFrame(const QuicGoAwayFrame& /*frame*/) override {
+  bool OnGoAwayFrame(const QuicGoAwayFrame& /*frame*/) override {
     DCHECK(false);
     return false;
   }
-  virtual bool OnWindowUpdateFrame(const QuicWindowUpdateFrame& /*frame*/)
-      override {
+  bool OnWindowUpdateFrame(const QuicWindowUpdateFrame& /*frame*/) override {
     DCHECK(false);
     return false;
   }
-  virtual bool OnBlockedFrame(const QuicBlockedFrame& frame) override {
+  bool OnBlockedFrame(const QuicBlockedFrame& frame) override {
     DCHECK(false);
     return false;
   }
-  virtual void OnFecData(const QuicFecData& /*fec*/) override {
-    DCHECK(false);
-  }
-  virtual void OnPacketComplete() override {
-    DCHECK(false);
-  }
+  void OnFecData(const QuicFecData& /*fec*/) override { DCHECK(false); }
+  void OnPacketComplete() override { DCHECK(false); }
 
  private:
   QuicDispatcher* dispatcher_;
diff --git a/net/tools/quic/quic_dispatcher.h b/net/tools/quic/quic_dispatcher.h
index 8b0ab6d..fc557c4 100644
--- a/net/tools/quic/quic_dispatcher.h
+++ b/net/tools/quic/quic_dispatcher.h
@@ -64,11 +64,10 @@
   // Creates ordinary QuicPerConnectionPacketWriter instances.
   class DefaultPacketWriterFactory : public PacketWriterFactory {
    public:
-    virtual ~DefaultPacketWriterFactory() {}
+    ~DefaultPacketWriterFactory() override {}
 
-    virtual QuicPacketWriter* Create(
-        QuicPacketWriter* writer,
-        QuicConnection* connection) override;
+    QuicPacketWriter* Create(QuicPacketWriter* writer,
+                             QuicConnection* connection) override;
   };
 
   // Ideally we'd have a linked_hash_set: the  boolean is unused.
@@ -84,15 +83,15 @@
                  PacketWriterFactory* packet_writer_factory,
                  EpollServer* epoll_server);
 
-  virtual ~QuicDispatcher();
+  ~QuicDispatcher() override;
 
   virtual void Initialize(int fd);
 
   // Process the incoming packet by creating a new session, passing it to
   // an existing session, or passing it to the TimeWaitListManager.
-  virtual void ProcessPacket(const IPEndPoint& server_address,
-                             const IPEndPoint& client_address,
-                             const QuicEncryptedPacket& packet) override;
+  void ProcessPacket(const IPEndPoint& server_address,
+                     const IPEndPoint& client_address,
+                     const QuicEncryptedPacket& packet) override;
 
   // Called when the socket becomes writable to allow queued writes to happen.
   virtual void OnCanWrite();
@@ -105,12 +104,11 @@
 
   // QuicServerSessionVisitor interface implementation:
   // Ensure that the closed connection is cleaned up asynchronously.
-  virtual void OnConnectionClosed(QuicConnectionId connection_id,
-                                  QuicErrorCode error) override;
+  void OnConnectionClosed(QuicConnectionId connection_id,
+                          QuicErrorCode error) override;
 
   // Queues the blocked writer for later resumption.
-  virtual void OnWriteBlocked(
-      QuicBlockedWriterInterface* blocked_writer) override;
+  void OnWriteBlocked(QuicBlockedWriterInterface* blocked_writer) override;
 
   typedef base::hash_map<QuicConnectionId, QuicSession*> SessionMap;
 
@@ -191,9 +189,9 @@
     public QuicConnection::PacketWriterFactory {
    public:
     PacketWriterFactoryAdapter(QuicDispatcher* dispatcher);
-    virtual ~PacketWriterFactoryAdapter ();
+    ~PacketWriterFactoryAdapter() override;
 
-    virtual QuicPacketWriter* Create(QuicConnection* connection) const override;
+    QuicPacketWriter* Create(QuicConnection* connection) const override;
 
    private:
     QuicDispatcher* dispatcher_;
diff --git a/net/tools/quic/quic_dispatcher_test.cc b/net/tools/quic/quic_dispatcher_test.cc
index bcbeb6a..45cddb0 100644
--- a/net/tools/quic/quic_dispatcher_test.cc
+++ b/net/tools/quic/quic_dispatcher_test.cc
@@ -107,7 +107,7 @@
     dispatcher_.Initialize(1);
   }
 
-  virtual ~QuicDispatcherTest() {}
+  ~QuicDispatcherTest() override {}
 
   MockConnection* connection1() {
     return reinterpret_cast<MockConnection*>(session1_->connection());
@@ -264,14 +264,13 @@
  public:
   BlockingWriter() : write_blocked_(false) {}
 
-  virtual bool IsWriteBlocked() const override { return write_blocked_; }
-  virtual void SetWritable() override { write_blocked_ = false; }
+  bool IsWriteBlocked() const override { return write_blocked_; }
+  void SetWritable() override { write_blocked_ = false; }
 
-  virtual WriteResult WritePacket(
-      const char* buffer,
-      size_t buf_len,
-      const IPAddressNumber& self_client_address,
-      const IPEndPoint& peer_client_address) override {
+  WriteResult WritePacket(const char* buffer,
+                          size_t buf_len,
+                          const IPAddressNumber& self_client_address,
+                          const IPEndPoint& peer_client_address) override {
     // It would be quite possible to actually implement this method here with
     // the fake blocked status, but it would be significantly more work in
     // Chromium, and since it's not called anyway, don't bother.
@@ -284,7 +283,7 @@
 
 class QuicDispatcherWriteBlockedListTest : public QuicDispatcherTest {
  public:
-  virtual void SetUp() {
+  void SetUp() override {
     writer_ = new BlockingWriter;
     QuicDispatcherPeer::SetPacketWriterFactory(&dispatcher_,
                                                new TestWriterFactory());
@@ -305,7 +304,7 @@
     blocked_list_ = QuicDispatcherPeer::GetWriteBlockedList(&dispatcher_);
   }
 
-  virtual void TearDown() {
+  void TearDown() override {
     EXPECT_CALL(*connection1(), SendConnectionClose(QUIC_PEER_GOING_AWAY));
     EXPECT_CALL(*connection2(), SendConnectionClose(QUIC_PEER_GOING_AWAY));
     dispatcher_.Shutdown();
diff --git a/net/tools/quic/quic_epoll_clock.h b/net/tools/quic/quic_epoll_clock.h
index 4eebefb..c5a1390 100644
--- a/net/tools/quic/quic_epoll_clock.h
+++ b/net/tools/quic/quic_epoll_clock.h
@@ -21,14 +21,14 @@
 class QuicEpollClock : public QuicClock {
  public:
   explicit QuicEpollClock(EpollServer* epoll_server);
-  virtual ~QuicEpollClock();
+  ~QuicEpollClock() override;
 
   // Returns the approximate current time as a QuicTime object.
-  virtual QuicTime ApproximateNow() const override;
+  QuicTime ApproximateNow() const override;
 
   // Returns the current time as a QuicTime object.
   // Note: this use significant resources please use only if needed.
-  virtual QuicTime Now() const override;
+  QuicTime Now() const override;
 
  protected:
   EpollServer* epoll_server_;
diff --git a/net/tools/quic/quic_epoll_connection_helper.cc b/net/tools/quic/quic_epoll_connection_helper.cc
index a8321f8..b763d82 100644
--- a/net/tools/quic/quic_epoll_connection_helper.cc
+++ b/net/tools/quic/quic_epoll_connection_helper.cc
@@ -28,14 +28,14 @@
         epoll_alarm_impl_(this) {}
 
  protected:
-  virtual void SetImpl() override {
+  void SetImpl() override {
     DCHECK(deadline().IsInitialized());
     epoll_server_->RegisterAlarm(
         deadline().Subtract(QuicTime::Zero()).ToMicroseconds(),
         &epoll_alarm_impl_);
   }
 
-  virtual void CancelImpl() override {
+  void CancelImpl() override {
     DCHECK(!deadline().IsInitialized());
     epoll_alarm_impl_.UnregisterIfRegistered();
   }
@@ -45,7 +45,7 @@
    public:
     explicit EpollAlarmImpl(QuicEpollAlarm* alarm) : alarm_(alarm) {}
 
-    virtual int64 OnAlarm() override {
+    int64 OnAlarm() override {
       EpollAlarm::OnAlarm();
       alarm_->Fire();
       // Fire will take care of registering the alarm, if needed.
diff --git a/net/tools/quic/quic_epoll_connection_helper.h b/net/tools/quic/quic_epoll_connection_helper.h
index 9ca2cf8..66a27bb 100644
--- a/net/tools/quic/quic_epoll_connection_helper.h
+++ b/net/tools/quic/quic_epoll_connection_helper.h
@@ -33,12 +33,12 @@
 class QuicEpollConnectionHelper : public QuicConnectionHelperInterface {
  public:
   explicit QuicEpollConnectionHelper(EpollServer* eps);
-  virtual ~QuicEpollConnectionHelper();
+  ~QuicEpollConnectionHelper() override;
 
   // QuicEpollConnectionHelperInterface
-  virtual const QuicClock* GetClock() const override;
-  virtual QuicRandom* GetRandomGenerator() override;
-  virtual QuicAlarm* CreateAlarm(QuicAlarm::Delegate* delegate) override;
+  const QuicClock* GetClock() const override;
+  QuicRandom* GetRandomGenerator() override;
+  QuicAlarm* CreateAlarm(QuicAlarm::Delegate* delegate) override;
 
   EpollServer* epoll_server() { return epoll_server_; }
 
diff --git a/net/tools/quic/quic_epoll_connection_helper_test.cc b/net/tools/quic/quic_epoll_connection_helper_test.cc
index 7234ecf..0b31cdf 100644
--- a/net/tools/quic/quic_epoll_connection_helper_test.cc
+++ b/net/tools/quic/quic_epoll_connection_helper_test.cc
@@ -19,7 +19,7 @@
  public:
   TestDelegate() : fired_(false) {}
 
-  virtual QuicTime OnAlarm() override {
+  QuicTime OnAlarm() override {
     fired_ = true;
     return QuicTime::Zero();
   }
diff --git a/net/tools/quic/quic_in_memory_cache.cc b/net/tools/quic/quic_in_memory_cache.cc
index c90142c..cb96335 100644
--- a/net/tools/quic/quic_in_memory_cache.cc
+++ b/net/tools/quic/quic_in_memory_cache.cc
@@ -29,24 +29,14 @@
 class CachingBalsaVisitor : public NoOpBalsaVisitor {
  public:
   CachingBalsaVisitor() : done_framing_(false) {}
-  virtual void ProcessBodyData(const char* input, size_t size) override {
+  void ProcessBodyData(const char* input, size_t size) override {
     AppendToBody(input, size);
   }
-  virtual void MessageDone() override {
-    done_framing_ = true;
-  }
-  virtual void HandleHeaderError(BalsaFrame* framer) override {
-    UnhandledError();
-  }
-  virtual void HandleHeaderWarning(BalsaFrame* framer) override {
-    UnhandledError();
-  }
-  virtual void HandleChunkingError(BalsaFrame* framer) override {
-    UnhandledError();
-  }
-  virtual void HandleBodyError(BalsaFrame* framer) override {
-    UnhandledError();
-  }
+  void MessageDone() override { done_framing_ = true; }
+  void HandleHeaderError(BalsaFrame* framer) override { UnhandledError(); }
+  void HandleHeaderWarning(BalsaFrame* framer) override { UnhandledError(); }
+  void HandleChunkingError(BalsaFrame* framer) override { UnhandledError(); }
+  void HandleBodyError(BalsaFrame* framer) override { UnhandledError(); }
   void UnhandledError() {
     LOG(DFATAL) << "Unhandled error framing HTTP.";
   }
diff --git a/net/tools/quic/quic_in_memory_cache_test.cc b/net/tools/quic/quic_in_memory_cache_test.cc
index 98a2b80..a94285c 100644
--- a/net/tools/quic/quic_in_memory_cache_test.cc
+++ b/net/tools/quic/quic_in_memory_cache_test.cc
@@ -39,9 +39,7 @@
     headers->ReplaceOrAppendHeader("host", host);
   }
 
-  virtual void SetUp() override {
-    QuicInMemoryCachePeer::ResetForTests();
-  }
+  void SetUp() override { QuicInMemoryCachePeer::ResetForTests(); }
 
   // This method was copied from end_to_end_test.cc in this directory.
   void AddToCache(const StringPiece& method,
diff --git a/net/tools/quic/quic_packet_writer_wrapper.h b/net/tools/quic/quic_packet_writer_wrapper.h
index a4db367..a8b819c 100644
--- a/net/tools/quic/quic_packet_writer_wrapper.h
+++ b/net/tools/quic/quic_packet_writer_wrapper.h
@@ -19,18 +19,17 @@
  public:
   QuicPacketWriterWrapper();
   explicit QuicPacketWriterWrapper(QuicPacketWriter* writer);
-  virtual ~QuicPacketWriterWrapper();
+  ~QuicPacketWriterWrapper() override;
 
   // Default implementation of the QuicPacketWriter interface. Passes everything
   // to |writer_|.
-  virtual WriteResult WritePacket(
-      const char* buffer,
-      size_t buf_len,
-      const IPAddressNumber& self_address,
-      const IPEndPoint& peer_address) override;
-  virtual bool IsWriteBlockedDataBuffered() const override;
-  virtual bool IsWriteBlocked() const override;
-  virtual void SetWritable() override;
+  WriteResult WritePacket(const char* buffer,
+                          size_t buf_len,
+                          const IPAddressNumber& self_address,
+                          const IPEndPoint& peer_address) override;
+  bool IsWriteBlockedDataBuffered() const override;
+  bool IsWriteBlocked() const override;
+  void SetWritable() override;
 
   // Takes ownership of |writer|.
   void set_writer(QuicPacketWriter* writer);
diff --git a/net/tools/quic/quic_per_connection_packet_writer.h b/net/tools/quic/quic_per_connection_packet_writer.h
index 390e43d..51de178 100644
--- a/net/tools/quic/quic_per_connection_packet_writer.h
+++ b/net/tools/quic/quic_per_connection_packet_writer.h
@@ -19,20 +19,20 @@
   // Does not take ownership of |shared_writer| or |connection|.
   QuicPerConnectionPacketWriter(QuicPacketWriter* shared_writer,
                                 QuicConnection* connection);
-  virtual ~QuicPerConnectionPacketWriter();
+  ~QuicPerConnectionPacketWriter() override;
 
   QuicPacketWriter* shared_writer() const { return shared_writer_; }
   QuicConnection* connection() const { return connection_; }
 
   // Default implementation of the QuicPacketWriter interface: Passes everything
   // to |shared_writer_|.
-  virtual WriteResult WritePacket(const char* buffer,
-                                  size_t buf_len,
-                                  const IPAddressNumber& self_address,
-                                  const IPEndPoint& peer_address) override;
-  virtual bool IsWriteBlockedDataBuffered() const override;
-  virtual bool IsWriteBlocked() const override;
-  virtual void SetWritable() override;
+  WriteResult WritePacket(const char* buffer,
+                          size_t buf_len,
+                          const IPAddressNumber& self_address,
+                          const IPEndPoint& peer_address) override;
+  bool IsWriteBlockedDataBuffered() const override;
+  bool IsWriteBlocked() const override;
+  void SetWritable() override;
 
  private:
   QuicPacketWriter* shared_writer_;  // Not owned.
diff --git a/net/tools/quic/quic_server.h b/net/tools/quic/quic_server.h
index a027a49..980f9ba 100644
--- a/net/tools/quic/quic_server.h
+++ b/net/tools/quic/quic_server.h
@@ -33,7 +33,7 @@
   QuicServer(const QuicConfig& config,
              const QuicVersionVector& supported_versions);
 
-  virtual ~QuicServer();
+  ~QuicServer() override;
 
   // Start listening on the specified address.
   bool Listen(const IPEndPoint& address);
@@ -45,12 +45,10 @@
   void Shutdown();
 
   // From EpollCallbackInterface
-  virtual void OnRegistration(EpollServer* eps,
-                              int fd,
-                              int event_mask) override {}
-  virtual void OnModification(int fd, int event_mask) override {}
-  virtual void OnEvent(int fd, EpollEvent* event) override;
-  virtual void OnUnregistration(int fd, bool replaced) override {}
+  void OnRegistration(EpollServer* eps, int fd, int event_mask) override {}
+  void OnModification(int fd, int event_mask) override {}
+  void OnEvent(int fd, EpollEvent* event) override;
+  void OnUnregistration(int fd, bool replaced) override {}
 
   // Reads a packet from the given fd, and then passes it off to
   // the QuicDispatcher.  Returns true if a packet is read, false
@@ -62,7 +60,7 @@
                                           ProcessPacketInterface* processor,
                                           uint32* packets_dropped);
 
-  virtual void OnShutdown(EpollServer* eps, int fd) override {}
+  void OnShutdown(EpollServer* eps, int fd) override {}
 
   void SetStrikeRegisterNoStartupPeriod() {
     crypto_config_.set_strike_register_no_startup_period();
diff --git a/net/tools/quic/quic_server_session.h b/net/tools/quic/quic_server_session.h
index eb0aab6..acec14b 100644
--- a/net/tools/quic/quic_server_session.h
+++ b/net/tools/quic/quic_server_session.h
@@ -50,14 +50,14 @@
                     QuicServerSessionVisitor* visitor);
 
   // Override the base class to notify the owner of the connection close.
-  virtual void OnConnectionClosed(QuicErrorCode error, bool from_peer) override;
-  virtual void OnWriteBlocked() override;
+  void OnConnectionClosed(QuicErrorCode error, bool from_peer) override;
+  void OnWriteBlocked() override;
 
   // Sends a server config update to the client, containing new bandwidth
   // estimate.
-  virtual void OnCongestionWindowChange(QuicTime now) override;
+  void OnCongestionWindowChange(QuicTime now) override;
 
-  virtual ~QuicServerSession();
+  ~QuicServerSession() override;
 
   virtual void InitializeSession(const QuicCryptoServerConfig& crypto_config);
 
@@ -66,7 +66,7 @@
   }
 
   // Override base class to process FEC config received from client.
-  virtual void OnConfigNegotiated() override;
+  void OnConfigNegotiated() override;
 
   void set_serving_region(string serving_region) {
     serving_region_ = serving_region;
@@ -74,9 +74,9 @@
 
  protected:
   // QuicSession methods:
-  virtual QuicDataStream* CreateIncomingDataStream(QuicStreamId id) override;
-  virtual QuicDataStream* CreateOutgoingDataStream() override;
-  virtual QuicCryptoServerStream* GetCryptoStream() override;
+  QuicDataStream* CreateIncomingDataStream(QuicStreamId id) override;
+  QuicDataStream* CreateOutgoingDataStream() override;
+  QuicCryptoServerStream* GetCryptoStream() override;
 
   // If we should create an incoming stream, returns true. Otherwise
   // does error handling, including communicating the error to the client and
diff --git a/net/tools/quic/quic_spdy_client_stream.h b/net/tools/quic/quic_spdy_client_stream.h
index 8274164..9b5573c 100644
--- a/net/tools/quic/quic_spdy_client_stream.h
+++ b/net/tools/quic/quic_spdy_client_stream.h
@@ -27,21 +27,21 @@
 class QuicSpdyClientStream : public QuicDataStream {
  public:
   QuicSpdyClientStream(QuicStreamId id, QuicClientSession* session);
-  virtual ~QuicSpdyClientStream();
+  ~QuicSpdyClientStream() override;
 
   // Override the base class to close the write side as soon as we get a
   // response.
   // SPDY/HTTP does not support bidirectional streaming.
-  virtual void OnStreamFrame(const QuicStreamFrame& frame) override;
+  void OnStreamFrame(const QuicStreamFrame& frame) override;
 
   // Override the base class to store the size of the headers.
-  virtual void OnStreamHeadersComplete(bool fin, size_t frame_len) override;
+  void OnStreamHeadersComplete(bool fin, size_t frame_len) override;
 
   // ReliableQuicStream implementation called by the session when there's
   // data for us.
-  virtual uint32 ProcessData(const char* data, uint32 data_len) override;
+  uint32 ProcessData(const char* data, uint32 data_len) override;
 
-  virtual void OnFinRead() override;
+  void OnFinRead() override;
 
   // Serializes the headers and body, sends it to the server, and
   // returns the number of bytes sent.
diff --git a/net/tools/quic/quic_spdy_server_stream.h b/net/tools/quic/quic_spdy_server_stream.h
index 4c2cb41..feb809f 100644
--- a/net/tools/quic/quic_spdy_server_stream.h
+++ b/net/tools/quic/quic_spdy_server_stream.h
@@ -28,12 +28,12 @@
 class QuicSpdyServerStream : public QuicDataStream {
  public:
   QuicSpdyServerStream(QuicStreamId id, QuicSession* session);
-  virtual ~QuicSpdyServerStream();
+  ~QuicSpdyServerStream() override;
 
   // ReliableQuicStream implementation called by the session when there's
   // data for us.
-  virtual uint32 ProcessData(const char* data, uint32 data_len) override;
-  virtual void OnFinRead() override;
+  uint32 ProcessData(const char* data, uint32 data_len) override;
+  void OnFinRead() override;
 
   void ParseRequestHeaders();
 
diff --git a/net/tools/quic/quic_time_wait_list_manager.cc b/net/tools/quic/quic_time_wait_list_manager.cc
index f99bf3f..eb32282 100644
--- a/net/tools/quic/quic_time_wait_list_manager.cc
+++ b/net/tools/quic/quic_time_wait_list_manager.cc
@@ -43,7 +43,7 @@
       : time_wait_list_manager_(time_wait_list_manager) {
   }
 
-  virtual int64 OnAlarm() override {
+  int64 OnAlarm() override {
     EpollAlarm::OnAlarm();
     time_wait_list_manager_->CleanUpOldConnectionIds();
     // Let the time wait manager register the alarm at appropriate time.
diff --git a/net/tools/quic/quic_time_wait_list_manager.h b/net/tools/quic/quic_time_wait_list_manager.h
index d9a5f92..cf049ed 100644
--- a/net/tools/quic/quic_time_wait_list_manager.h
+++ b/net/tools/quic/quic_time_wait_list_manager.h
@@ -52,7 +52,7 @@
                           QuicServerSessionVisitor* visitor,
                           EpollServer* epoll_server,
                           const QuicVersionVector& supported_versions);
-  virtual ~QuicTimeWaitListManager();
+  ~QuicTimeWaitListManager() override;
 
   // Adds the given connection_id to time wait state for kTimeWaitPeriod.
   // Henceforth, any packet bearing this connection_id should not be processed
@@ -83,7 +83,7 @@
   // Called by the dispatcher when the underlying socket becomes writable again,
   // since we might need to send pending public reset packets which we didn't
   // send because the underlying socket was write blocked.
-  virtual void OnCanWrite() override;
+  void OnCanWrite() override;
 
   // Used to delete connection_id entries that have outlived their time wait
   // period.
diff --git a/net/tools/quic/quic_time_wait_list_manager_test.cc b/net/tools/quic/quic_time_wait_list_manager_test.cc
index 335b22c..05c3954 100644
--- a/net/tools/quic/quic_time_wait_list_manager_test.cc
+++ b/net/tools/quic/quic_time_wait_list_manager_test.cc
@@ -45,10 +45,9 @@
 class FramerVisitorCapturingPublicReset : public NoOpFramerVisitor {
  public:
   FramerVisitorCapturingPublicReset() {}
-  virtual ~FramerVisitorCapturingPublicReset() override {}
+  ~FramerVisitorCapturingPublicReset() override {}
 
-  virtual void OnPublicResetPacket(
-      const QuicPublicResetPacket& public_reset) override {
+  void OnPublicResetPacket(const QuicPublicResetPacket& public_reset) override {
     public_reset_packet_ = public_reset;
   }
 
diff --git a/net/tools/quic/test_tools/mock_epoll_server.h b/net/tools/quic/test_tools/mock_epoll_server.h
index b3b312e..742a957 100644
--- a/net/tools/quic/test_tools/mock_epoll_server.h
+++ b/net/tools/quic/test_tools/mock_epoll_server.h
@@ -19,10 +19,10 @@
 class FakeTimeEpollServer : public EpollServer {
  public:
   FakeTimeEpollServer();
-  virtual ~FakeTimeEpollServer();
+  ~FakeTimeEpollServer() override;
 
   // Replaces the EpollServer NowInUsec.
-  virtual int64 NowInUsec() const override;
+  int64 NowInUsec() const override;
 
   void set_now_in_usec(int64 nius) { now_in_usec_ = nius; }
 
@@ -52,7 +52,7 @@
   typedef base::hash_multimap<int64, struct epoll_event> EventQueue;
 
   MockEpollServer();
-  virtual ~MockEpollServer();
+  ~MockEpollServer() override;
 
   // time_in_usec is the time at which the event specified
   // by 'ee' will be delivered. Note that it -is- possible
@@ -85,16 +85,16 @@
  protected:  // functions
   // These functions do nothing here, as we're not actually
   // using the epoll_* syscalls.
-  virtual void DelFD(int fd) const override {}
-  virtual void AddFD(int fd, int event_mask) const override {}
-  virtual void ModFD(int fd, int event_mask) const override {}
+  void DelFD(int fd) const override {}
+  void AddFD(int fd, int event_mask) const override {}
+  void ModFD(int fd, int event_mask) const override {}
 
   // Replaces the epoll_server's epoll_wait_impl.
-  virtual int epoll_wait_impl(int epfd,
-                              struct epoll_event* events,
-                              int max_events,
-                              int timeout_in_ms) override;
-  virtual void SetNonblocking (int fd) override {}
+  int epoll_wait_impl(int epfd,
+                      struct epoll_event* events,
+                      int max_events,
+                      int timeout_in_ms) override;
+  void SetNonblocking(int fd) override {}
 
  private:  // members
   EventQueue event_queue_;
diff --git a/net/tools/quic/test_tools/packet_dropping_test_writer.cc b/net/tools/quic/test_tools/packet_dropping_test_writer.cc
index 2571868..9e01fd4 100644
--- a/net/tools/quic/test_tools/packet_dropping_test_writer.cc
+++ b/net/tools/quic/test_tools/packet_dropping_test_writer.cc
@@ -21,7 +21,7 @@
   explicit WriteUnblockedAlarm(PacketDroppingTestWriter* writer)
       : writer_(writer) {}
 
-  virtual QuicTime OnAlarm() override {
+  QuicTime OnAlarm() override {
     DVLOG(1) << "Unblocking socket.";
     writer_->OnCanWrite();
     return QuicTime::Zero();
@@ -37,9 +37,7 @@
  public:
   explicit DelayAlarm(PacketDroppingTestWriter* writer) : writer_(writer) {}
 
-  virtual QuicTime OnAlarm() override {
-    return writer_->ReleaseOldPackets();
-  }
+  QuicTime OnAlarm() override { return writer_->ReleaseOldPackets(); }
 
  private:
   PacketDroppingTestWriter* writer_;
diff --git a/net/tools/quic/test_tools/packet_dropping_test_writer.h b/net/tools/quic/test_tools/packet_dropping_test_writer.h
index 29a21a8..842d70e 100644
--- a/net/tools/quic/test_tools/packet_dropping_test_writer.h
+++ b/net/tools/quic/test_tools/packet_dropping_test_writer.h
@@ -36,7 +36,7 @@
 
   PacketDroppingTestWriter();
 
-  virtual ~PacketDroppingTestWriter();
+  ~PacketDroppingTestWriter() override;
 
   // Must be called before blocking, reordering or delaying (loss is OK). May be
   // called after connecting if the helper is not available before.
@@ -45,15 +45,14 @@
   void Initialize(QuicEpollConnectionHelper* helper, Delegate* on_can_write);
 
   // QuicPacketWriter methods:
-  virtual WriteResult WritePacket(
-      const char* buffer,
-      size_t buf_len,
-      const IPAddressNumber& self_address,
-      const IPEndPoint& peer_address) override;
+  WriteResult WritePacket(const char* buffer,
+                          size_t buf_len,
+                          const IPAddressNumber& self_address,
+                          const IPEndPoint& peer_address) override;
 
-  virtual bool IsWriteBlocked() const override;
+  bool IsWriteBlocked() const override;
 
-  virtual void SetWritable() override;
+  void SetWritable() override;
 
   // Writes out any packet which should have been sent by now
   // to the contained writer and returns the time
diff --git a/net/tools/quic/test_tools/quic_test_client.cc b/net/tools/quic/test_tools/quic_test_client.cc
index d53958d..e1a2740 100644
--- a/net/tools/quic/test_tools/quic_test_client.cc
+++ b/net/tools/quic/test_tools/quic_test_client.cc
@@ -41,15 +41,14 @@
 class RecordingProofVerifier : public ProofVerifier {
  public:
   // ProofVerifier interface.
-  virtual QuicAsyncStatus VerifyProof(
-      const string& hostname,
-      const string& server_config,
-      const vector<string>& certs,
-      const string& signature,
-      const ProofVerifyContext* context,
-      string* error_details,
-      scoped_ptr<ProofVerifyDetails>* details,
-      ProofVerifierCallback* callback) override {
+  QuicAsyncStatus VerifyProof(const string& hostname,
+                              const string& server_config,
+                              const vector<string>& certs,
+                              const string& signature,
+                              const ProofVerifyContext* context,
+                              string* error_details,
+                              scoped_ptr<ProofVerifyDetails>* details,
+                              ProofVerifierCallback* callback) override {
     common_name_.clear();
     if (certs.empty()) {
       return QUIC_FAILURE;
diff --git a/net/tools/quic/test_tools/quic_test_client.h b/net/tools/quic/test_tools/quic_test_client.h
index c9fd22e..c5b7a3b 100644
--- a/net/tools/quic/test_tools/quic_test_client.h
+++ b/net/tools/quic/test_tools/quic_test_client.h
@@ -45,9 +45,9 @@
                      const QuicVersionVector& supported_versions,
                      EpollServer* epoll_server);
 
-  virtual ~MockableQuicClient() override;
-  virtual QuicPacketWriter* CreateQuicPacketWriter() override;
-  virtual QuicConnectionId GenerateConnectionId() override;
+  ~MockableQuicClient() override;
+  QuicPacketWriter* CreateQuicPacketWriter() override;
+  QuicConnectionId GenerateConnectionId() override;
   void UseWriter(QuicPacketWriterWrapper* writer);
   void UseConnectionId(QuicConnectionId connection_id);
 
@@ -75,7 +75,7 @@
                  const QuicConfig& config,
                  const QuicVersionVector& supported_versions);
 
-  virtual ~QuicTestClient();
+  ~QuicTestClient() override;
 
   // ExpectCertificates controls whether the server is expected to provide
   // certificates. The certificates, if any, are not verified, but the common
@@ -91,45 +91,43 @@
   // From SimpleClient
   // Clears any outstanding state and sends a simple GET of 'uri' to the
   // server.  Returns 0 if the request failed and no bytes were written.
-  virtual ssize_t SendRequest(const string& uri) override;
-  virtual ssize_t SendMessage(const HTTPMessage& message) override;
-  virtual string SendCustomSynchronousRequest(
-      const HTTPMessage& message) override;
-  virtual string SendSynchronousRequest(const string& uri) override;
-  virtual void Connect() override;
-  virtual void ResetConnection() override;
-  virtual void Disconnect() override;
-  virtual IPEndPoint LocalSocketAddress() const override;
-  virtual void ClearPerRequestState() override;
-  virtual void WaitForResponseForMs(int timeout_ms) override;
-  virtual void WaitForInitialResponseForMs(int timeout_ms) override;
-  virtual ssize_t Send(const void *buffer, size_t size) override;
-  virtual bool response_complete() const override;
-  virtual bool response_headers_complete() const override;
-  virtual const BalsaHeaders* response_headers() const override;
-  virtual int64 response_size() const override;
-  virtual int response_header_size() const override;
-  virtual int64 response_body_size() const override;
-  virtual size_t bytes_read() const override;
-  virtual size_t bytes_written() const override;
-  virtual bool buffer_body() const override;
-  virtual void set_buffer_body(bool buffer_body) override;
-  virtual bool ServerInLameDuckMode() const override;
-  virtual const string& response_body() override;
-  virtual bool connected() const override;
+  ssize_t SendRequest(const string& uri) override;
+  ssize_t SendMessage(const HTTPMessage& message) override;
+  string SendCustomSynchronousRequest(const HTTPMessage& message) override;
+  string SendSynchronousRequest(const string& uri) override;
+  void Connect() override;
+  void ResetConnection() override;
+  void Disconnect() override;
+  IPEndPoint LocalSocketAddress() const override;
+  void ClearPerRequestState() override;
+  void WaitForResponseForMs(int timeout_ms) override;
+  void WaitForInitialResponseForMs(int timeout_ms) override;
+  ssize_t Send(const void* buffer, size_t size) override;
+  bool response_complete() const override;
+  bool response_headers_complete() const override;
+  const BalsaHeaders* response_headers() const override;
+  int64 response_size() const override;
+  int response_header_size() const override;
+  int64 response_body_size() const override;
+  size_t bytes_read() const override;
+  size_t bytes_written() const override;
+  bool buffer_body() const override;
+  void set_buffer_body(bool buffer_body) override;
+  bool ServerInLameDuckMode() const override;
+  const string& response_body() override;
+  bool connected() const override;
   // These functions are all unimplemented functions from SimpleClient, and log
   // DFATAL if called by users of SimpleClient.
-  virtual ssize_t SendAndWaitForResponse(const void *buffer,
-                                         size_t size) override;
-  virtual void Bind(IPEndPoint* local_address) override;
-  virtual string SerializeMessage(const HTTPMessage& message) override;
-  virtual IPAddressNumber bind_to_address() const override;
-  virtual void set_bind_to_address(IPAddressNumber address) override;
-  virtual const IPEndPoint& address() const override;
-  virtual size_t requests_sent() const override;
+  ssize_t SendAndWaitForResponse(const void* buffer, size_t size) override;
+  void Bind(IPEndPoint* local_address) override;
+  string SerializeMessage(const HTTPMessage& message) override;
+  IPAddressNumber bind_to_address() const override;
+  void set_bind_to_address(IPAddressNumber address) override;
+  const IPEndPoint& address() const override;
+  size_t requests_sent() const override;
 
   // From QuicDataStream::Visitor
-  virtual void OnClose(QuicDataStream* stream) override;
+  void OnClose(QuicDataStream* stream) override;
 
   // Configures client_ to take ownership of and use the writer.
   // Must be called before initial connect.
diff --git a/net/tools/quic/test_tools/quic_test_utils.cc b/net/tools/quic/test_tools/quic_test_utils.cc
index 781b3c3..2477483 100644
--- a/net/tools/quic/test_tools/quic_test_utils.cc
+++ b/net/tools/quic/test_tools/quic_test_utils.cc
@@ -23,10 +23,9 @@
     : public QuicConnection::PacketWriterFactory {
  public:
   NiceMockPacketWriterFactory() {}
-  virtual ~NiceMockPacketWriterFactory() {}
+  ~NiceMockPacketWriterFactory() override {}
 
-  virtual QuicPacketWriter* Create(
-      QuicConnection* /*connection*/) const override {
+  QuicPacketWriter* Create(QuicConnection* /*connection*/) const override {
     return new testing::NiceMock<MockPacketWriter>();
   }
 
diff --git a/net/tools/quic/test_tools/quic_test_utils.h b/net/tools/quic/test_tools/quic_test_utils.h
index dc70e69..cbd7fbe 100644
--- a/net/tools/quic/test_tools/quic_test_utils.h
+++ b/net/tools/quic/test_tools/quic_test_utils.h
@@ -166,10 +166,10 @@
 class TestWriterFactory : public QuicDispatcher::PacketWriterFactory {
  public:
   TestWriterFactory();
-  virtual ~TestWriterFactory();
+  ~TestWriterFactory() override;
 
-  virtual QuicPacketWriter* Create(QuicPacketWriter* writer,
-                                   QuicConnection* connection) override;
+  QuicPacketWriter* Create(QuicPacketWriter* writer,
+                           QuicConnection* connection) override;
 
   // Calls OnPacketSent on the last QuicConnection to write through one of the
   // packet writers created by this factory.
@@ -181,13 +181,12 @@
     PerConnectionPacketWriter(TestWriterFactory* factory,
                               QuicPacketWriter* writer,
                               QuicConnection* connection);
-    virtual ~PerConnectionPacketWriter();
+    ~PerConnectionPacketWriter() override;
 
-    virtual WriteResult WritePacket(
-        const char* buffer,
-        size_t buf_len,
-        const IPAddressNumber& self_address,
-        const IPEndPoint& peer_address) override;
+    WriteResult WritePacket(const char* buffer,
+                            size_t buf_len,
+                            const IPAddressNumber& self_address,
+                            const IPEndPoint& peer_address) override;
 
    private:
     TestWriterFactory* factory_;
diff --git a/net/tools/quic/test_tools/server_thread.h b/net/tools/quic/test_tools/server_thread.h
index cb92b01..774ff67 100644
--- a/net/tools/quic/test_tools/server_thread.h
+++ b/net/tools/quic/test_tools/server_thread.h
@@ -21,14 +21,14 @@
                IPEndPoint address,
                bool strike_register_no_startup_period);
 
-  virtual ~ServerThread();
+  ~ServerThread() override;
 
   // Prepares the server, but does not start accepting connections. Useful for
   // injecting mocks.
   void Initialize();
 
   // Runs the event loop. Will initialize if necessary.
-  virtual void Run() override;
+  void Run() override;
 
   // Waits for the handshake to be confirmed for the first session created.
   void WaitForCryptoHandshakeConfirmed();
diff --git a/net/url_request/url_fetcher_impl_unittest.cc b/net/url_request/url_fetcher_impl_unittest.cc
index cf52773..9b36621 100644
--- a/net/url_request/url_fetcher_impl_unittest.cc
+++ b/net/url_request/url_fetcher_impl_unittest.cc
@@ -108,7 +108,7 @@
 
  protected:
   // testing::Test:
-  virtual void SetUp() override {
+  void SetUp() override {
     testing::Test::SetUp();
 
     context_.reset(new ThrottlingTestURLRequestContext());
@@ -120,7 +120,7 @@
 #endif
   }
 
-  virtual void TearDown() override {
+  void TearDown() override {
 #if defined(USE_NSS) || defined(OS_IOS)
     ShutdownNSSHttpIO();
 #endif
@@ -141,7 +141,7 @@
 class URLFetcherMockDnsTest : public URLFetcherTest {
  public:
   // testing::Test:
-  virtual void SetUp() override;
+  void SetUp() override;
 
   // URLFetcherTest:
   void CreateFetcher(const GURL& url) override;
@@ -347,7 +347,7 @@
 class URLFetcherStopOnRedirectTest : public URLFetcherTest {
  public:
   URLFetcherStopOnRedirectTest();
-  virtual ~URLFetcherStopOnRedirectTest();
+  ~URLFetcherStopOnRedirectTest() override;
 
   // URLFetcherTest:
   void CreateFetcher(const GURL& url) override;
diff --git a/net/url_request/url_fetcher_response_writer_unittest.cc b/net/url_request/url_fetcher_response_writer_unittest.cc
index 71cb671..e9f9380 100644
--- a/net/url_request/url_fetcher_response_writer_unittest.cc
+++ b/net/url_request/url_fetcher_response_writer_unittest.cc
@@ -23,7 +23,7 @@
 
 class URLFetcherStringWriterTest : public PlatformTest {
  protected:
-  virtual void SetUp() override {
+  void SetUp() override {
     writer_.reset(new URLFetcherStringWriter);
     buf_ = new StringIOBuffer(kData);
   }
@@ -54,7 +54,7 @@
 
 class URLFetcherFileWriterTest : public PlatformTest {
  protected:
-  virtual void SetUp() override {
+  void SetUp() override {
     ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
     file_path_ = temp_dir_.path().AppendASCII("test.txt");
     writer_.reset(new URLFetcherFileWriter(
@@ -144,7 +144,7 @@
 
 class URLFetcherFileWriterTemporaryFileTest : public PlatformTest {
  protected:
-  virtual void SetUp() override {
+  void SetUp() override {
     writer_.reset(new URLFetcherFileWriter(
         base::MessageLoopProxy::current(), base::FilePath()));
     buf_ = new StringIOBuffer(kData);
diff --git a/net/url_request/url_request_file_job.cc b/net/url_request/url_request_file_job.cc
index 6fc4d1c..eb24a95 100644
--- a/net/url_request/url_request_file_job.cc
+++ b/net/url_request/url_request_file_job.cc
@@ -270,6 +270,11 @@
   DCHECK_GE(remaining_bytes_, 0);
 
   if (remaining_bytes_ > 0 && byte_range_.first_byte_position() != 0) {
+    // TODO(vadimt): Remove ScopedProfile below once crbug.com/423948 is fixed.
+    tracked_objects::ScopedProfile tracking_profile1(
+        FROM_HERE_WITH_EXPLICIT_FUNCTION(
+            "423948 URLRequestFileJob::DidOpen 1"));
+
     int rv = stream_->Seek(base::File::FROM_BEGIN,
                            byte_range_.first_byte_position(),
                            base::Bind(&URLRequestFileJob::DidSeek,
diff --git a/net/url_request/url_request_ftp_job_unittest.cc b/net/url_request/url_request_ftp_job_unittest.cc
index 5f41edc..fa11d55 100644
--- a/net/url_request/url_request_ftp_job_unittest.cc
+++ b/net/url_request/url_request_ftp_job_unittest.cc
@@ -217,7 +217,7 @@
                          &ftp_transaction_factory_) {
   }
 
-  virtual ~URLRequestFtpJobTest() {
+  ~URLRequestFtpJobTest() override {
     // Clean up any remaining tasks that mess up unrelated tests.
     base::RunLoop run_loop;
     run_loop.RunUntilIdle();
diff --git a/net/url_request/url_request_job.cc b/net/url_request/url_request_job.cc
index 0fe4c7c..09e462b 100644
--- a/net/url_request/url_request_job.cc
+++ b/net/url_request/url_request_job.cc
@@ -8,6 +8,7 @@
 #include "base/compiler_specific.h"
 #include "base/message_loop/message_loop.h"
 #include "base/power_monitor/power_monitor.h"
+#include "base/profiler/scoped_profile.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "net/base/auth.h"
@@ -299,6 +300,11 @@
 }
 
 void URLRequestJob::NotifyHeadersComplete() {
+  // TODO(vadimt): Remove ScopedProfile below once crbug.com/423948 is fixed.
+  tracked_objects::ScopedProfile tracking_profile(
+      FROM_HERE_WITH_EXPLICIT_FUNCTION(
+          "423948 URLRequestJob::NotifyHeadersComplete"));
+
   if (!request_ || !request_->has_delegate())
     return;  // The request was destroyed, so there is no more work to do.
 
diff --git a/net/url_request/url_request_throttler_unittest.cc b/net/url_request/url_request_throttler_unittest.cc
index 5a309b9..1cda5a6 100644
--- a/net/url_request/url_request_throttler_unittest.cc
+++ b/net/url_request/url_request_throttler_unittest.cc
@@ -172,7 +172,7 @@
       : request_(context_.CreateRequest(GURL(), DEFAULT_PRIORITY, NULL, NULL)) {
   }
 
-  virtual void SetUp();
+  void SetUp() override;
 
   TimeTicks now_;
   MockURLRequestThrottlerManager manager_;  // Dummy object, not used.
@@ -355,9 +355,7 @@
       : request_(context_.CreateRequest(GURL(), DEFAULT_PRIORITY, NULL, NULL)) {
   }
 
-  virtual void SetUp() {
-    request_->SetLoadFlags(0);
-  }
+  void SetUp() override { request_->SetLoadFlags(0); }
 
   void ExpectEntryAllowsAllOnErrorIfOptedOut(
       URLRequestThrottlerEntryInterface* entry,
diff --git a/net/url_request/url_request_unittest.cc b/net/url_request/url_request_unittest.cc
index 700b070..d900069 100644
--- a/net/url_request/url_request_unittest.cc
+++ b/net/url_request/url_request_unittest.cc
@@ -615,7 +615,7 @@
     default_context_.set_job_factory(&job_factory_);
     default_context_.Init();
   }
-  virtual ~URLRequestTest() {
+  ~URLRequestTest() override {
     // URLRequestJobs may post clean-up tasks on destruction.
     base::RunLoop().RunUntilIdle();
   }
@@ -6452,7 +6452,7 @@
     default_context_.set_network_delegate(&default_network_delegate_);
     default_context_.Init();
   }
-  virtual ~HTTPSRequestTest() {}
+  ~HTTPSRequestTest() override {}
 
  protected:
   TestNetworkDelegate default_network_delegate_;  // Must outlive URLRequest.
@@ -7125,7 +7125,7 @@
 class HTTPSFallbackTest : public testing::Test {
  public:
   HTTPSFallbackTest() : context_(true) {}
-  virtual ~HTTPSFallbackTest() {}
+  ~HTTPSFallbackTest() override {}
 
  protected:
   void DoFallbackTest(const SpawnedTestServer::SSLOptions& ssl_options) {
@@ -7377,7 +7377,7 @@
     default_context_.set_cert_verifier(&cert_verifier_);
     default_context_.Init();
   }
-  virtual ~HTTPSSessionTest() {}
+  ~HTTPSSessionTest() override {}
 
  protected:
   MockCertVerifier cert_verifier_;
@@ -7476,7 +7476,7 @@
                                    kOCSPTestCertPolicy)) {
   }
 
-  virtual void SetUp() override {
+  void SetUp() override {
     SetupContext(&context_);
     context_.Init();
 
@@ -7513,7 +7513,7 @@
     *out_cert_status = r->ssl_info().cert_status;
   }
 
-  virtual ~HTTPSOCSPTest() {
+  ~HTTPSOCSPTest() override {
 #if defined(USE_NSS) || defined(OS_IOS)
     ShutdownNSSHttpIO();
 #endif
diff --git a/net/websockets/websocket_basic_stream_test.cc b/net/websockets/websocket_basic_stream_test.cc
index 92b7d3f..2955ad6 100644
--- a/net/websockets/websocket_basic_stream_test.cc
+++ b/net/websockets/websocket_basic_stream_test.cc
@@ -110,7 +110,7 @@
         generator_(&GenerateNulMaskingKey),
         expect_all_io_to_complete_(true) {}
 
-  virtual ~WebSocketBasicStreamSocketTest() {
+  ~WebSocketBasicStreamSocketTest() override {
     // stream_ has a reference to socket_data_ (via MockTCPClientSocket) and so
     // should be destroyed first.
     stream_.reset();
@@ -237,7 +237,7 @@
  protected:
   // All write tests use the same frame, so it is easiest to create it during
   // test creation.
-  virtual void SetUp() override { PrepareWriteFrame(); }
+  void SetUp() override { PrepareWriteFrame(); }
 
   // Creates a WebSocketFrame with a wire format matching kWriteFrame and adds
   // it to |frames_|.
diff --git a/net/websockets/websocket_channel_test.cc b/net/websockets/websocket_channel_test.cc
index 15163de..1ffe1e9 100644
--- a/net/websockets/websocket_channel_test.cc
+++ b/net/websockets/websocket_channel_test.cc
@@ -934,7 +934,7 @@
         .WillByDefault(Return(CHANNEL_DELETED));
   }
 
-  virtual ~WebSocketChannelEventInterfaceTest() {
+  ~WebSocketChannelEventInterfaceTest() override {
     DefaultValue<ChannelState>::Clear();
   }
 
@@ -969,7 +969,7 @@
 class WebSocketChannelSendUtf8Test
     : public WebSocketChannelEventInterfaceTest {
  public:
-  virtual void SetUp() {
+  void SetUp() override {
     set_stream(make_scoped_ptr(new WriteableFakeWebSocketStream));
     // For the purpose of the tests using this fixture, it doesn't matter
     // whether these methods are called or not.
@@ -999,7 +999,7 @@
 // mock WebSocketStream.
 class WebSocketChannelReceiveUtf8Test : public WebSocketChannelStreamTest {
  public:
-  virtual void SetUp() {
+  void SetUp() override {
     // For the purpose of the tests using this fixture, it doesn't matter
     // whether these methods are called or not.
     EXPECT_CALL(*mock_stream_, GetSubProtocol()).Times(AnyNumber());
diff --git a/net/websockets/websocket_deflate_stream_test.cc b/net/websockets/websocket_deflate_stream_test.cc
index 1b0d123..c30ab32 100644
--- a/net/websockets/websocket_deflate_stream_test.cc
+++ b/net/websockets/websocket_deflate_stream_test.cc
@@ -212,9 +212,9 @@
   WebSocketDeflateStreamTest()
       : mock_stream_(NULL),
         predictor_(NULL) {}
-  virtual ~WebSocketDeflateStreamTest() {}
+  ~WebSocketDeflateStreamTest() override {}
 
-  virtual void SetUp() {
+  void SetUp() override {
     Initialize(WebSocketDeflater::TAKE_OVER_CONTEXT, kWindowBits);
   }
 
@@ -245,9 +245,9 @@
     : public WebSocketDeflateStreamTest {
  public:
   WebSocketDeflateStreamWithDoNotTakeOverContextTest() {}
-  virtual ~WebSocketDeflateStreamWithDoNotTakeOverContextTest() {}
+  ~WebSocketDeflateStreamWithDoNotTakeOverContextTest() override {}
 
-  virtual void SetUp() {
+  void SetUp() override {
     Initialize(WebSocketDeflater::DO_NOT_TAKE_OVER_CONTEXT, kWindowBits);
   }
 };
@@ -256,10 +256,10 @@
     : public WebSocketDeflateStreamTest {
  public:
   WebSocketDeflateStreamWithClientWindowBitsTest() {}
-  virtual ~WebSocketDeflateStreamWithClientWindowBitsTest() {}
+  ~WebSocketDeflateStreamWithClientWindowBitsTest() override {}
 
   // Overridden to postpone the call to Initialize().
-  virtual void SetUp() {}
+  void SetUp() override {}
 
   // This needs to be called explicitly from the tests.
   void SetUpWithWindowBits(int window_bits) {
diff --git a/net/websockets/websocket_job_test.cc b/net/websockets/websocket_job_test.cc
index 3faf809..c84af8f 100644
--- a/net/websockets/websocket_job_test.cc
+++ b/net/websockets/websocket_job_test.cc
@@ -228,6 +228,13 @@
 
   CookieMonster* GetCookieMonster() override { return NULL; }
 
+  scoped_ptr<CookieStore::CookieChangedSubscription>
+  AddCallbackForCookie(const GURL& url, const std::string& name,
+                       const CookieChangedCallback& callback) override {
+    ADD_FAILURE();
+    return scoped_ptr<CookieChangedSubscription>();
+  }
+
   const std::vector<Entry>& entries() const { return entries_; }
 
  private:
@@ -384,12 +391,12 @@
       : spdy_util_(GetParam()),
         enable_websocket_over_spdy_(false) {}
 
-  virtual void SetUp() override {
+  void SetUp() override {
     stream_type_ = STREAM_INVALID;
     cookie_store_ = new MockCookieStore;
     context_.reset(new MockURLRequestContext(cookie_store_.get()));
   }
-  virtual void TearDown() override {
+  void TearDown() override {
     cookie_store_ = NULL;
     context_.reset();
     websocket_ = NULL;
diff --git a/net/websockets/websocket_stream_test.cc b/net/websockets/websocket_stream_test.cc
index 5ce3331..801e84e 100644
--- a/net/websockets/websocket_stream_test.cc
+++ b/net/websockets/websocket_stream_test.cc
@@ -408,7 +408,7 @@
   };
 
   class StreamCreation : public WebSocketStreamCreateTest {
-    virtual void TestBody() override {}
+    void TestBody() override {}
   };
 
   scoped_ptr<base::HistogramSamples> GetSamples(const std::string& name) {
diff --git a/sandbox/linux/bpf_dsl/policy_compiler.cc b/sandbox/linux/bpf_dsl/policy_compiler.cc
index 514b430..5be32f4 100644
--- a/sandbox/linux/bpf_dsl/policy_compiler.cc
+++ b/sandbox/linux/bpf_dsl/policy_compiler.cc
@@ -77,9 +77,8 @@
 }
 
 bool HasUnsafeTraps(const Policy* policy) {
-  for (uint32_t sysnum : SyscallSet::All()) {
-    if (SyscallSet::IsValid(sysnum) &&
-        policy->EvaluateSyscall(sysnum)->HasUnsafeTraps()) {
+  for (uint32_t sysnum : SyscallSet::ValidOnly()) {
+    if (policy->EvaluateSyscall(sysnum)->HasUnsafeTraps()) {
       return true;
     }
   }
diff --git a/sandbox/linux/seccomp-bpf/syscall_iterator.cc b/sandbox/linux/seccomp-bpf/syscall_iterator.cc
index 1b4e067..3590530 100644
--- a/sandbox/linux/seccomp-bpf/syscall_iterator.cc
+++ b/sandbox/linux/seccomp-bpf/syscall_iterator.cc
@@ -39,37 +39,6 @@
 #endif
 };
 
-// NextSyscall returns the next system call in the specified system
-// call set after |cur|, or 0 if no such system call exists.
-uint32_t NextSyscall(uint32_t cur, bool invalid_only) {
-  for (const SyscallRange& range : kValidSyscallRanges) {
-    if (range.first > 0 && cur < range.first - 1) {
-      return range.first - 1;
-    }
-    if (cur <= range.last) {
-      if (invalid_only) {
-        return range.last + 1;
-      }
-      return cur + 1;
-    }
-  }
-
-  // BPF programs only ever operate on unsigned quantities. So, that's how
-  // we iterate; we return values from 0..0xFFFFFFFFu. But there are places,
-  // where the kernel might interpret system call numbers as signed
-  // quantities, so the boundaries between signed and unsigned values are
-  // potential problem cases. We want to explicitly return these values from
-  // our iterator.
-  if (cur < 0x7FFFFFFFu)
-    return 0x7FFFFFFFu;
-  if (cur < 0x80000000u)
-    return 0x80000000u;
-
-  if (cur < 0xFFFFFFFFu)
-    return 0xFFFFFFFFu;
-  return 0;
-}
-
 }  // namespace
 
 SyscallSet::Iterator SyscallSet::begin() const {
@@ -95,7 +64,8 @@
 
 SyscallSet::Iterator::Iterator(Set set, bool done)
     : set_(set), done_(done), num_(0) {
-  if (set_ == Set::INVALID_ONLY && !done_ && IsValid(num_)) {
+  // If the set doesn't contain 0, we need to skip to the next element.
+  if (!done && set_ == (IsValid(num_) ? Set::INVALID_ONLY : Set::VALID_ONLY)) {
     ++*this;
   }
 }
@@ -108,7 +78,7 @@
 SyscallSet::Iterator& SyscallSet::Iterator::operator++() {
   DCHECK(!done_);
 
-  num_ = NextSyscall(num_, set_ == Set::INVALID_ONLY);
+  num_ = NextSyscall();
   if (num_ == 0) {
     done_ = true;
   }
@@ -116,6 +86,49 @@
   return *this;
 }
 
+// NextSyscall returns the next system call in the iterated system
+// call set after |num_|, or 0 if no such system call exists.
+uint32_t SyscallSet::Iterator::NextSyscall() const {
+  const bool want_valid = (set_ != Set::INVALID_ONLY);
+  const bool want_invalid = (set_ != Set::VALID_ONLY);
+
+  for (const SyscallRange& range : kValidSyscallRanges) {
+    if (want_invalid && range.first > 0 && num_ < range.first - 1) {
+      // Even when iterating invalid syscalls, we only include the end points;
+      // so skip directly to just before the next (valid) range.
+      return range.first - 1;
+    }
+    if (want_valid && num_ < range.first) {
+      return range.first;
+    }
+    if (want_valid && num_ < range.last) {
+      return num_ + 1;
+    }
+    if (want_invalid && num_ <= range.last) {
+      return range.last + 1;
+    }
+  }
+
+  if (want_invalid) {
+    // BPF programs only ever operate on unsigned quantities. So,
+    // that's how we iterate; we return values from
+    // 0..0xFFFFFFFFu. But there are places, where the kernel might
+    // interpret system call numbers as signed quantities, so the
+    // boundaries between signed and unsigned values are potential
+    // problem cases. We want to explicitly return these values from
+    // our iterator.
+    if (num_ < 0x7FFFFFFFu)
+      return 0x7FFFFFFFu;
+    if (num_ < 0x80000000u)
+      return 0x80000000u;
+
+    if (num_ < 0xFFFFFFFFu)
+      return 0xFFFFFFFFu;
+  }
+
+  return 0;
+}
+
 bool operator==(const SyscallSet::Iterator& lhs,
                 const SyscallSet::Iterator& rhs) {
   DCHECK(lhs.set_ == rhs.set_);
diff --git a/sandbox/linux/seccomp-bpf/syscall_iterator.h b/sandbox/linux/seccomp-bpf/syscall_iterator.h
index d89b981..5080fcc 100644
--- a/sandbox/linux/seccomp-bpf/syscall_iterator.h
+++ b/sandbox/linux/seccomp-bpf/syscall_iterator.h
@@ -7,6 +7,8 @@
 
 #include <stdint.h>
 
+#include <iterator>
+
 #include "base/macros.h"
 #include "sandbox/sandbox_export.h"
 
@@ -41,6 +43,10 @@
   // system call numbers.
   static SyscallSet All() { return SyscallSet(Set::ALL); }
 
+  // ValidOnly returns a SyscallSet that contains only valid system
+  // call numbers.
+  static SyscallSet ValidOnly() { return SyscallSet(Set::VALID_ONLY); }
+
   // InvalidOnly returns a SyscallSet that contains only invalid
   // system call numbers, but still omits numbers in the middle of a
   // range of invalid system call numbers.
@@ -51,7 +57,7 @@
   static bool IsValid(uint32_t num);
 
  private:
-  enum class Set { ALL, INVALID_ONLY };
+  enum class Set { ALL, VALID_ONLY, INVALID_ONLY };
 
   explicit SyscallSet(Set set) : set_(set) {}
 
@@ -65,7 +71,8 @@
 
 // Iterator provides C++ input iterator semantics for traversing a
 // SyscallSet.
-class SyscallSet::Iterator {
+class SyscallSet::Iterator
+    : public std::iterator<std::input_iterator_tag, uint32_t> {
  public:
   Iterator(const Iterator& it)
       : set_(it.set_), done_(it.done_), num_(it.num_) {}
@@ -77,6 +84,8 @@
  private:
   Iterator(Set set, bool done);
 
+  uint32_t NextSyscall() const;
+
   Set set_;
   bool done_;
   uint32_t num_;
diff --git a/sandbox/linux/seccomp-bpf/syscall_iterator_unittest.cc b/sandbox/linux/seccomp-bpf/syscall_iterator_unittest.cc
index e277f86..3bc1eaa 100644
--- a/sandbox/linux/seccomp-bpf/syscall_iterator_unittest.cc
+++ b/sandbox/linux/seccomp-bpf/syscall_iterator_unittest.cc
@@ -93,12 +93,32 @@
   }
 }
 
+SANDBOX_TEST(SyscallIterator, ValidOnlyIsOnlyValid) {
+  for (uint32_t sysnum : SyscallSet::ValidOnly()) {
+    SANDBOX_ASSERT(SyscallSet::IsValid(sysnum));
+  }
+}
+
 SANDBOX_TEST(SyscallIterator, InvalidOnlyIsOnlyInvalid) {
   for (uint32_t sysnum : SyscallSet::InvalidOnly()) {
     SANDBOX_ASSERT(!SyscallSet::IsValid(sysnum));
   }
 }
 
+SANDBOX_TEST(SyscallIterator, AllIsValidOnlyPlusInvalidOnly) {
+  std::vector<uint32_t> merged;
+  const SyscallSet valid_only = SyscallSet::ValidOnly();
+  const SyscallSet invalid_only = SyscallSet::InvalidOnly();
+  std::merge(valid_only.begin(),
+             valid_only.end(),
+             invalid_only.begin(),
+             invalid_only.end(),
+             std::back_inserter(merged));
+
+  const SyscallSet all = SyscallSet::All();
+  SANDBOX_ASSERT(merged == std::vector<uint32_t>(all.begin(), all.end()));
+}
+
 }  // namespace
 
 }  // namespace sandbox
diff --git a/skia/skia.gyp b/skia/skia.gyp
index 2d2668a..16e03a2 100644
--- a/skia/skia.gyp
+++ b/skia/skia.gyp
@@ -8,7 +8,7 @@
     # However, in the static mode, we need to build skia as multiple targets
     # in order to support the use case where a platform (e.g. Android) may
     # already have a copy of skia as a system library.
-    ['component=="static_library" and use_system_skia==0', {
+    ['component=="static_library"', {
       'targets': [
         {
           'target_name': 'skia_library',
@@ -25,18 +25,6 @@
         },
       ],
     }],
-    ['component=="static_library" and use_system_skia==1', {
-      'targets': [
-        {
-          'target_name': 'skia_library',
-          'type': 'none',
-          'includes': [
-            'skia_system.gypi',
-            '../build/android/increase_size_for_speed.gypi',
-          ],
-        },
-      ],
-    }],
     ['component=="static_library"', {
       'targets': [
         {
diff --git a/skia/skia_system.gypi b/skia/skia_system.gypi
deleted file mode 100644
index a26bdc0..0000000
--- a/skia/skia_system.gypi
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright 2013 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.
-
-
-# This gypi file contains the shim header generation and other settings to use
-# the system version of skia on Android.
-{
-  'direct_dependent_settings': {
-    # This makes the Android build system set the include path appropriately.
-    'libraries': [ '-lskia' ],
-    # Some Chrome code uses non-public header files (http://crbug.com/274425),
-    # so we need to add this include path for now to make it build. The system
-    # version of skia is already required to be the same as the chromium version
-    # so using the bundled headers shouldn't break anything.
-    'include_dirs': [
-      '../third_party/skia/src/core',
-    ],
-  },
-  'link_settings': {
-    # This actually causes the final binary to be linked against skia.
-    'libraries': [ '-lskia' ],
-  },
-  'variables': {
-    'headers_root_path': '../third_party/skia/include',
-  },
-  'includes': [
-    '../third_party/skia/gyp/public_headers.gypi',
-    '../build/shim_headers.gypi',
-  ],
-}
diff --git a/sky/viewer/platform/weblayertreeview_impl.cc b/sky/viewer/platform/weblayertreeview_impl.cc
index a90532d..2aa5486 100644
--- a/sky/viewer/platform/weblayertreeview_impl.cc
+++ b/sky/viewer/platform/weblayertreeview_impl.cc
@@ -39,7 +39,7 @@
   settings.layer_transforms_should_scale_layer_contents = true;
 
   cc::SharedBitmapManager* shared_bitmap_manager = NULL;
-  cc::GpuMemoryBufferManager* gpu_memory_buffer_manager = NULL;
+  gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager = NULL;
 
   layer_tree_host_ =
       cc::LayerTreeHost::CreateThreaded(this,
diff --git a/testing/android/BUILD.gn b/testing/android/BUILD.gn
index c26830c..eefa22d 100644
--- a/testing/android/BUILD.gn
+++ b/testing/android/BUILD.gn
@@ -10,6 +10,7 @@
   sources = [
     "native_test_launcher.cc"
   ]
+  libs = [ "log" ]
   deps = [
     ":native_test_jni_headers",
     ":native_test_util",
diff --git a/testing/android/java/src/org/chromium/native_test/ChromeNativeTestActivity.java b/testing/android/java/src/org/chromium/native_test/ChromeNativeTestActivity.java
index 9b241d1..f5d381a 100644
--- a/testing/android/java/src/org/chromium/native_test/ChromeNativeTestActivity.java
+++ b/testing/android/java/src/org/chromium/native_test/ChromeNativeTestActivity.java
@@ -36,7 +36,7 @@
         PathUtils.setPrivateDataDirectorySuffix("chrome");
 
         ResourceExtractor resourceExtractor = ResourceExtractor.get(getApplicationContext());
-        resourceExtractor.setExtractAllPaksForTesting();
+        resourceExtractor.setExtractAllPaksAndV8SnapshotForTesting();
         resourceExtractor.startExtractingResources();
         resourceExtractor.waitForCompletion();
 
diff --git a/testing/buildbot/chromium.linux.json b/testing/buildbot/chromium.linux.json
index fc3cd9c..e0db1ad 100644
--- a/testing/buildbot/chromium.linux.json
+++ b/testing/buildbot/chromium.linux.json
@@ -92,6 +92,12 @@
       "url_unittests",
       "views_unittests",
       "wm_unittests"
+    ],
+    "scripts": [
+      {
+        "name": "telemetry_unittests",
+        "script": "telemetry_unittests.py"
+      }
     ]
   },
   "Linux Tests (dbg)(1)(32)": {
diff --git a/testing/buildbot/chromium.win.json b/testing/buildbot/chromium.win.json
index a25e3fe..3357ca7 100644
--- a/testing/buildbot/chromium.win.json
+++ b/testing/buildbot/chromium.win.json
@@ -8,6 +8,7 @@
           "can_use_on_swarming_builders": true
         }
       },
+      "app_shell_browsertests",
       "app_shell_unittests",
       {
         "test": "ash_unittests",
@@ -96,6 +97,7 @@
   "Vista Tests (1)": {
     "gtest_tests": [
       "accessibility_unittests",
+      "app_shell_browsertests",
       "app_shell_unittests",
       "ash_unittests",
       "aura_unittests",
@@ -205,6 +207,7 @@
           "can_use_on_swarming_builders": true
         }
       },
+      "app_shell_browsertests",
       "app_shell_unittests",
       "aura_unittests",
       {
@@ -313,6 +316,7 @@
         }
       },
       "app_list_unittests",
+      "app_shell_browsertests",
       "app_shell_unittests",
       "cacheinvalidation_unittests",
       "cast_unittests",
@@ -396,6 +400,7 @@
           "can_use_on_swarming_builders": true
         }
       },
+      "app_shell_browsertests",
       "app_shell_unittests",
       "aura_unittests",
       {
diff --git a/testing/buildbot/chromium_trybot.json b/testing/buildbot/chromium_trybot.json
index 162b5ae..e0f6955 100644
--- a/testing/buildbot/chromium_trybot.json
+++ b/testing/buildbot/chromium_trybot.json
@@ -122,10 +122,6 @@
       "test": "mojo_application_manager_unittests",
       "platforms": ["linux"]
     },
-    {
-      "test": "mojo_shell_tests",
-      "platforms": ["linux"]
-    },
     "mojo_system_unittests",
     {
       "test": "nacl_loader_unittests",
@@ -176,7 +172,7 @@
     },
     {
       "test": "app_shell_browsertests",
-      "platforms": ["linux"]
+      "platforms": ["linux", "win"]
     },
     {
       "test": "app_shell_unittests",
diff --git a/testing/scripts/common.py b/testing/scripts/common.py
index 92ad688..47e7fb7 100644
--- a/testing/scripts/common.py
+++ b/testing/scripts/common.py
@@ -65,13 +65,13 @@
     os.remove(path)
 
 
-def parse_common_test_results(json_results):
+def parse_common_test_results(json_results, test_separator='/'):
   def convert_trie_to_flat_paths(trie, prefix=None):
     # Also see webkitpy.layout_tests.layout_package.json_results_generator
     result = {}
     for name, data in trie.iteritems():
       if prefix:
-        name = prefix + '/' + name
+        name = prefix + test_separator + name
       if len(data) and not 'actual' in data and not 'expected' in data:
         result.update(convert_trie_to_flat_paths(data, name))
       else:
diff --git a/testing/scripts/telemetry_unittests.py b/testing/scripts/telemetry_unittests.py
index c652549..2c68063 100755
--- a/testing/scripts/telemetry_unittests.py
+++ b/testing/scripts/telemetry_unittests.py
@@ -40,7 +40,7 @@
     with open(tempfile_path) as f:
       results = json.load(f)
 
-  parsed_results = common.parse_common_test_results(results)
+  parsed_results = common.parse_common_test_results(results, test_separator='.')
   failures = parsed_results['unexpected_failures']
 
   json.dump({
diff --git a/third_party/libevent/BUILD.gn b/third_party/libevent/BUILD.gn
index a1bd0c5..648dae3 100644
--- a/third_party/libevent/BUILD.gn
+++ b/third_party/libevent/BUILD.gn
@@ -2,7 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-source_set("libevent") {
+static_library("libevent") {
   sources = [
     "buffer.c",
     "evbuffer.c",
diff --git a/third_party/modp_b64/BUILD.gn b/third_party/modp_b64/BUILD.gn
index 2ec992b..539abe1 100644
--- a/third_party/modp_b64/BUILD.gn
+++ b/third_party/modp_b64/BUILD.gn
@@ -2,7 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-source_set("modp_b64") {
+static_library("modp_b64") {
   sources = [
     "modp_b64.cc",
     "modp_b64.h",
diff --git a/tools/gritsettings/resource_ids b/tools/gritsettings/resource_ids
index 7fa7d9f..a1fce5c 100644
--- a/tools/gritsettings/resource_ids
+++ b/tools/gritsettings/resource_ids
@@ -10,7 +10,7 @@
 # The first entry in the file, SRCDIR, is special: It is a relative path from
 # this file to the base of your checkout.
 #
-# The range of ID values, which is used by pak files, is from 0 to 2^16 - 1. 
+# The range of ID values, which is used by pak files, is from 0 to 2^16 - 1.
 {
   "SRCDIR": "../..",
 
@@ -215,6 +215,9 @@
   "chrome/app/address_input_strings.grd": {
     "messages": [29100],
   },
+  "remoting/resources/remoting_strings.grd": {
+    "messages": [29550],
+  },
   "components/components_strings.grd": {
     "messages": [30000],
   },
diff --git a/tools/relocation_packer/src/elf_file.cc b/tools/relocation_packer/src/elf_file.cc
index 62c390a..3ffccec 100644
--- a/tools/relocation_packer/src/elf_file.cc
+++ b/tools/relocation_packer/src/elf_file.cc
@@ -71,9 +71,10 @@
 
 // Rewrite section data.  Allocates new data and makes it the data element's
 // buffer.  Relies on program exit to free allocated data.
-void RewriteSectionData(Elf_Data* data,
+void RewriteSectionData(Elf_Scn* section,
                         const void* section_data,
                         size_t size) {
+  Elf_Data* data = GetSectionData(section);
   CHECK(size == data->d_size);
   uint8_t* area = new uint8_t[size];
   memcpy(area, section_data, size);
@@ -797,7 +798,7 @@
 
   void* section_data = &dynamics[0];
   size_t bytes = dynamics.size() * sizeof(dynamics[0]);
-  RewriteSectionData(data, section_data, bytes);
+  RewriteSectionData(dynamic_section, section_data, bytes);
 }
 
 // Resize a section.  If the new size is larger than the current size, open
@@ -952,7 +953,7 @@
         relocations_base + data->d_size / sizeof(relocations[0]));
 
     LOG(INFO) << "Relocations   : REL";
-    return PackTypedRelocations<ELF::Rel>(relocations, data);
+    return PackTypedRelocations<ELF::Rel>(relocations);
   }
 
   if (relocations_type_ == RELA) {
@@ -964,7 +965,7 @@
         relocations_base + data->d_size / sizeof(relocations[0]));
 
     LOG(INFO) << "Relocations   : RELA";
-    return PackTypedRelocations<ELF::Rela>(relocations, data);
+    return PackTypedRelocations<ELF::Rela>(relocations);
   }
 
   NOTREACHED();
@@ -973,8 +974,7 @@
 
 // Helper for PackRelocations().  Rel type is one of ELF::Rel or ELF::Rela.
 template <typename Rel>
-bool ElfFile::PackTypedRelocations(const std::vector<Rel>& relocations,
-                                   Elf_Data* data) {
+bool ElfFile::PackTypedRelocations(const std::vector<Rel>& relocations) {
   // Filter relocations into those that are relative and others.
   std::vector<Rel> relative_relocations;
   std::vector<Rel> other_relocations;
@@ -1085,17 +1085,16 @@
   const void* section_data = &other_relocations[0];
   const size_t bytes = other_relocations.size() * sizeof(other_relocations[0]);
   ResizeSection<Rel>(elf_, relocations_section_, bytes);
-  RewriteSectionData(data, section_data, bytes);
+  RewriteSectionData(relocations_section_, section_data, bytes);
 
   // Rewrite the current packed android relocations section to hold the packed
   // relative relocations.
-  data = GetSectionData(android_relocations_section_);
   ResizeSection<Rel>(elf_, android_relocations_section_, packed_bytes);
-  RewriteSectionData(data, packed_data, packed_bytes);
+  RewriteSectionData(android_relocations_section_, packed_data, packed_bytes);
 
   // Rewrite .dynamic to include two new tags describing the packed android
   // relocations.
-  data = GetSectionData(dynamic_section_);
+  Elf_Data* data = GetSectionData(dynamic_section_);
   const ELF::Dyn* dynamic_base = reinterpret_cast<ELF::Dyn*>(data->d_buf);
   std::vector<ELF::Dyn> dynamics(
       dynamic_base,
@@ -1116,7 +1115,7 @@
   }
   const void* dynamics_data = &dynamics[0];
   const size_t dynamics_bytes = dynamics.size() * sizeof(dynamics[0]);
-  RewriteSectionData(data, dynamics_data, dynamics_bytes);
+  RewriteSectionData(dynamic_section_, dynamics_data, dynamics_bytes);
 
   Flush();
   return true;
@@ -1149,7 +1148,7 @@
     // Signature is APR1, unpack relocations.
     CHECK(relocations_type_ == REL);
     LOG(INFO) << "Relocations   : REL";
-    return UnpackTypedRelocations<ELF::Rel>(packed, data);
+    return UnpackTypedRelocations<ELF::Rel>(packed);
   }
 
   if (packed.size() > 3 &&
@@ -1160,7 +1159,7 @@
     // Signature is APA1, unpack relocations with addends.
     CHECK(relocations_type_ == RELA);
     LOG(INFO) << "Relocations   : RELA";
-    return UnpackTypedRelocations<ELF::Rela>(packed, data);
+    return UnpackTypedRelocations<ELF::Rela>(packed);
   }
 
   LOG(ERROR) << "Packed relative relocations not found (not packed?)";
@@ -1169,8 +1168,7 @@
 
 // Helper for UnpackRelocations().  Rel type is one of ELF::Rel or ELF::Rela.
 template <typename Rel>
-bool ElfFile::UnpackTypedRelocations(const std::vector<uint8_t>& packed,
-                                     Elf_Data* data) {
+bool ElfFile::UnpackTypedRelocations(const std::vector<uint8_t>& packed) {
   // Unpack the data to re-materialize the relative relocations.
   const size_t packed_bytes = packed.size() * sizeof(packed[0]);
   LOG(INFO) << "Packed   relative: " << packed_bytes << " bytes";
@@ -1182,7 +1180,7 @@
   LOG(INFO) << "Unpacked relative: " << unpacked_bytes << " bytes";
 
   // Retrieve the current dynamic relocations section data.
-  data = GetSectionData(relocations_section_);
+  Elf_Data* data = GetSectionData(relocations_section_);
 
   // Interpret data as relocations.
   const Rel* relocations_base = reinterpret_cast<Rel*>(data->d_buf);
@@ -1234,17 +1232,17 @@
   const size_t bytes = relocations.size() * sizeof(relocations[0]);
   LOG(INFO) << "Total         : " << relocations.size() << " entries";
   ResizeSection<Rel>(elf_, relocations_section_, bytes);
-  RewriteSectionData(data, section_data, bytes);
+  RewriteSectionData(relocations_section_, section_data, bytes);
 
   // Nearly empty the current packed android relocations section.  Leaves a
   // four-byte stub so that some data remains allocated to the section.
   // This is a convenience which allows us to re-pack this file again without
   // having to remove the section and then add a new small one with objcopy.
   // The way we resize sections relies on there being some data in a section.
-  data = GetSectionData(android_relocations_section_);
   ResizeSection<Rel>(
       elf_, android_relocations_section_, sizeof(kStubIdentifier));
-  RewriteSectionData(data, &kStubIdentifier, sizeof(kStubIdentifier));
+  RewriteSectionData(
+      android_relocations_section_, &kStubIdentifier, sizeof(kStubIdentifier));
 
   // Rewrite .dynamic to remove two tags describing packed android relocations.
   data = GetSectionData(dynamic_section_);
@@ -1256,7 +1254,7 @@
   RemoveDynamicEntry(DT_ANDROID_REL_SIZE, &dynamics);
   const void* dynamics_data = &dynamics[0];
   const size_t dynamics_bytes = dynamics.size() * sizeof(dynamics[0]);
-  RewriteSectionData(data, dynamics_data, dynamics_bytes);
+  RewriteSectionData(dynamic_section_, dynamics_data, dynamics_bytes);
 
   Flush();
   return true;
diff --git a/tools/relocation_packer/src/elf_file.h b/tools/relocation_packer/src/elf_file.h
index 51239c0..6550274 100644
--- a/tools/relocation_packer/src/elf_file.h
+++ b/tools/relocation_packer/src/elf_file.h
@@ -100,14 +100,12 @@
   // Templated packer, helper for PackRelocations().  Rel type is one of
   // ELF::Rel or ELF::Rela.
   template <typename Rel>
-  bool PackTypedRelocations(const std::vector<Rel>& relocations,
-                            Elf_Data* data);
+  bool PackTypedRelocations(const std::vector<Rel>& relocations);
 
   // Templated unpacker, helper for UnpackRelocations().  Rel type is one of
   // ELF::Rel or ELF::Rela.
   template <typename Rel>
-  bool UnpackTypedRelocations(const std::vector<uint8_t>& packed,
-                              Elf_Data* data);
+  bool UnpackTypedRelocations(const std::vector<uint8_t>& packed);
 
   // Write ELF file changes.
   void Flush();
diff --git a/tools/valgrind/chrome_tests.py b/tools/valgrind/chrome_tests.py
index 43caaa4..e4f62a5 100755
--- a/tools/valgrind/chrome_tests.py
+++ b/tools/valgrind/chrome_tests.py
@@ -690,6 +690,7 @@
     "message_center": TestMessageCenter,
     "message_center_unittests" : TestMessageCenter,
     "mojo_common": TestMojoCommon,
+    "mojo_system": TestMojoSystem,
     "mojo_public_system": TestMojoPublicSystem,
     "mojo_public_utility": TestMojoPublicUtility,
     "mojo_public_bindings": TestMojoPublicBindings,
diff --git a/tools/valgrind/gtest_exclude/aura_unittests.gtest.txt b/tools/valgrind/gtest_exclude/aura_unittests.gtest.txt
index 69ce8dc..321f281 100644
--- a/tools/valgrind/gtest_exclude/aura_unittests.gtest.txt
+++ b/tools/valgrind/gtest_exclude/aura_unittests.gtest.txt
@@ -1,2 +1,5 @@
 # Flaky under Valgrind, see http://crbug.com/348331
 WindowEventDispatcherTest.TouchMovesHeld
+
+# Failing on cros/win. crbug.com/427729
+GestureRecognizerTest.GestureEventSmallPinchEnabled
diff --git a/tools/valgrind/gtest_exclude/ui_base_unittests.gtest.txt b/tools/valgrind/gtest_exclude/ui_base_unittests.gtest.txt
new file mode 100644
index 0000000..59ec948
--- /dev/null
+++ b/tools/valgrind/gtest_exclude/ui_base_unittests.gtest.txt
@@ -0,0 +1,2 @@
+# Hangs, fails on cros valgrind. crbug.com/427818
+TouchExplorationTest.*
diff --git a/ui/compositor/compositor.h b/ui/compositor/compositor.h
index d666303..bbed8ec 100644
--- a/ui/compositor/compositor.h
+++ b/ui/compositor/compositor.h
@@ -34,7 +34,6 @@
 
 namespace cc {
 class ContextProvider;
-class GpuMemoryBufferManager;
 class Layer;
 class LayerTreeDebugState;
 class LayerTreeHost;
@@ -48,6 +47,7 @@
 }
 
 namespace gpu {
+class GpuMemoryBufferManager;
 struct Mailbox;
 }
 
@@ -96,7 +96,7 @@
   virtual cc::SharedBitmapManager* GetSharedBitmapManager() = 0;
 
   // Gets the GPU memory buffer manager.
-  virtual cc::GpuMemoryBufferManager* GetGpuMemoryBufferManager() = 0;
+  virtual gpu::GpuMemoryBufferManager* GetGpuMemoryBufferManager() = 0;
 
   // Gets the compositor message loop, or NULL if not using threaded
   // compositing.
diff --git a/ui/gl/gl_bindings_skia_in_process.cc b/ui/gl/gl_bindings_skia_in_process.cc
index a01bc38..cfcb7a3 100644
--- a/ui/gl/gl_bindings_skia_in_process.cc
+++ b/ui/gl/gl_bindings_skia_in_process.cc
@@ -555,6 +555,18 @@
   glUseProgram(program);
 }
 
+GLvoid StubGLVertexAttrib1f(GLuint indx, const GLfloat value) {
+  glVertexAttrib1f(indx, value);
+}
+
+GLvoid StubGLVertexAttrib2fv(GLuint indx, const GLfloat* values) {
+  glVertexAttrib2fv(indx, values);
+}
+
+GLvoid StubGLVertexAttrib3fv(GLuint indx, const GLfloat* values) {
+  glVertexAttrib3fv(indx, values);
+}
+
 GLvoid StubGLVertexAttrib4fv(GLuint indx, const GLfloat* values) {
   glVertexAttrib4fv(indx, values);
 }
@@ -708,6 +720,9 @@
   functions->fUniformMatrix3fv = StubGLUniformMatrix3fv;
   functions->fUniformMatrix4fv = StubGLUniformMatrix4fv;
   functions->fUseProgram = StubGLUseProgram;
+  functions->fVertexAttrib1f = StubGLVertexAttrib1f;
+  functions->fVertexAttrib2fv = StubGLVertexAttrib2fv;
+  functions->fVertexAttrib3fv = StubGLVertexAttrib3fv;
   functions->fVertexAttrib4fv = StubGLVertexAttrib4fv;
   functions->fVertexAttribPointer = StubGLVertexAttribPointer;
   functions->fViewport = StubGLViewport;