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;